[Mesa-dev] [PATCH 16/18] i965: Convert GS_STATE to genxml.
Kenneth Graunke
kenneth at whitecape.org
Wed Jul 12 21:42:49 UTC 2017
On Friday, June 16, 2017 4:31:29 PM PDT Rafael Antognolli wrote:
> Merge the code with gen6+ 3DSTATE_GS, and delete brw_gs_state.c,
> together with brw_gs_unit_state.
>
> Signed-off-by: Rafael Antognolli <rafael.antognolli at intel.com>
> ---
> src/mesa/drivers/dri/i965/Makefile.sources | 1 -
> src/mesa/drivers/dri/i965/brw_gs_state.c | 101 --------------------------
> src/mesa/drivers/dri/i965/brw_state.h | 1 -
> src/mesa/drivers/dri/i965/brw_structs.h | 44 -----------
> src/mesa/drivers/dri/i965/genX_state_upload.c | 80 +++++++++++++-------
> 5 files changed, 55 insertions(+), 172 deletions(-)
> delete mode 100644 src/mesa/drivers/dri/i965/brw_gs_state.c
>
> diff --git a/src/mesa/drivers/dri/i965/Makefile.sources b/src/mesa/drivers/dri/i965/Makefile.sources
> index 8af9a7c..a06a8c1 100644
> --- a/src/mesa/drivers/dri/i965/Makefile.sources
> +++ b/src/mesa/drivers/dri/i965/Makefile.sources
> @@ -24,7 +24,6 @@ i965_FILES = \
> brw_formatquery.c \
> brw_gs.c \
> brw_gs.h \
> - brw_gs_state.c \
> brw_gs_surface_state.c \
> brw_link.cpp \
> brw_meta_util.c \
> diff --git a/src/mesa/drivers/dri/i965/brw_gs_state.c b/src/mesa/drivers/dri/i965/brw_gs_state.c
> deleted file mode 100644
> index bc3d2e5..0000000
> --- a/src/mesa/drivers/dri/i965/brw_gs_state.c
> +++ /dev/null
> @@ -1,101 +0,0 @@
> -/*
> - Copyright (C) Intel Corp. 2006. All Rights Reserved.
> - Intel funded Tungsten Graphics to
> - develop this 3D driver.
> -
> - Permission is hereby granted, free of charge, to any person obtaining
> - a copy of this software and associated documentation files (the
> - "Software"), to deal in the Software without restriction, including
> - without limitation the rights to use, copy, modify, merge, publish,
> - distribute, sublicense, and/or sell copies of the Software, and to
> - permit persons to whom the Software is furnished to do so, subject to
> - the following conditions:
> -
> - The above copyright notice and this permission notice (including the
> - next paragraph) shall be included in all copies or substantial
> - portions of the Software.
> -
> - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
> - IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
> - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
> - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
> - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
> -
> - **********************************************************************/
> - /*
> - * Authors:
> - * Keith Whitwell <keithw at vmware.com>
> - */
> -
> -
> -
> -#include "brw_context.h"
> -#include "brw_state.h"
> -#include "brw_defines.h"
> -#include "intel_batchbuffer.h"
> -
> -static void
> -brw_upload_gs_unit(struct brw_context *brw)
> -{
> - struct brw_gs_unit_state *gs;
> -
> - gs = brw_state_batch(brw, sizeof(*gs), 32, &brw->ff_gs.state_offset);
> -
> - memset(gs, 0, sizeof(*gs));
> -
> - /* BRW_NEW_PROGRAM_CACHE | BRW_NEW_GS_PROG_DATA */
> - if (brw->ff_gs.prog_active) {
> - gs->thread0.grf_reg_count = (ALIGN(brw->ff_gs.prog_data->total_grf, 16) /
> - 16 - 1);
> -
> - gs->thread0.kernel_start_pointer =
> - brw_program_reloc(brw,
> - brw->ff_gs.state_offset +
> - offsetof(struct brw_gs_unit_state, thread0),
> - brw->ff_gs.prog_offset +
> - (gs->thread0.grf_reg_count << 1)) >> 6;
> -
> - gs->thread1.floating_point_mode = BRW_FLOATING_POINT_NON_IEEE_754;
> - gs->thread1.single_program_flow = 1;
> -
> - gs->thread3.dispatch_grf_start_reg = 1;
> - gs->thread3.const_urb_entry_read_offset = 0;
> - gs->thread3.const_urb_entry_read_length = 0;
> - gs->thread3.urb_entry_read_offset = 0;
> - gs->thread3.urb_entry_read_length =
> - brw->ff_gs.prog_data->urb_read_length;
> -
> - /* BRW_NEW_URB_FENCE */
> - gs->thread4.nr_urb_entries = brw->urb.nr_gs_entries;
> - gs->thread4.urb_entry_allocation_size = brw->urb.vsize - 1;
> -
> - if (brw->urb.nr_gs_entries >= 8)
> - gs->thread4.max_threads = 1;
> - else
> - gs->thread4.max_threads = 0;
> - }
> -
> - if (brw->gen == 5)
> - gs->thread4.rendering_enable = 1;
> -
> - /* BRW_NEW_VIEWPORT_COUNT */
> - gs->gs6.max_vp_index = brw->clip.viewport_count - 1;
> -
> - brw->ctx.NewDriverState |= BRW_NEW_GEN4_UNIT_STATE;
> -}
> -
> -const struct brw_tracked_state brw_gs_unit = {
> - .dirty = {
> - .mesa = 0,
> - .brw = BRW_NEW_BATCH |
> - BRW_NEW_BLORP |
> - BRW_NEW_PUSH_CONSTANT_ALLOCATION |
> - BRW_NEW_FF_GS_PROG_DATA |
> - BRW_NEW_PROGRAM_CACHE |
> - BRW_NEW_URB_FENCE |
> - BRW_NEW_VIEWPORT_COUNT,
> - },
> - .emit = brw_upload_gs_unit,
> -};
> diff --git a/src/mesa/drivers/dri/i965/brw_state.h b/src/mesa/drivers/dri/i965/brw_state.h
> index af70464..8f3bd7f 100644
> --- a/src/mesa/drivers/dri/i965/brw_state.h
> +++ b/src/mesa/drivers/dri/i965/brw_state.h
> @@ -53,7 +53,6 @@ extern const struct brw_tracked_state brw_constant_buffer;
> extern const struct brw_tracked_state brw_curbe_offsets;
> extern const struct brw_tracked_state brw_invariant_state;
> extern const struct brw_tracked_state brw_fs_samplers;
> -extern const struct brw_tracked_state brw_gs_unit;
> extern const struct brw_tracked_state brw_binding_table_pointers;
> extern const struct brw_tracked_state brw_depthbuffer;
> extern const struct brw_tracked_state brw_recalculate_urb_fence;
> diff --git a/src/mesa/drivers/dri/i965/brw_structs.h b/src/mesa/drivers/dri/i965/brw_structs.h
> index 12f3024..6feab0d 100644
> --- a/src/mesa/drivers/dri/i965/brw_structs.h
> +++ b/src/mesa/drivers/dri/i965/brw_structs.h
> @@ -180,50 +180,6 @@ struct brw_clip_unit_state
> float viewport_ymax;
> };
>
> -struct brw_gs_unit_state
> -{
> - struct thread0 thread0;
> - struct thread1 thread1;
> - struct thread2 thread2;
> - struct thread3 thread3;
> -
> - struct
> - {
> - unsigned pad0:8;
> - unsigned rendering_enable:1; /* for Ironlake */
> - unsigned pad4:1;
> - unsigned stats_enable:1;
> - unsigned nr_urb_entries:7;
> - unsigned pad1:1;
> - unsigned urb_entry_allocation_size:5;
> - unsigned pad2:1;
> - unsigned max_threads:5;
> - unsigned pad3:2;
> - } thread4;
> -
> - struct
> - {
> - unsigned sampler_count:3;
> - unsigned pad0:2;
> - unsigned sampler_state_pointer:27;
> - } gs5;
> -
> -
> - struct
> - {
> - unsigned max_vp_index:4;
> - unsigned pad0:12;
> - unsigned svbi_post_inc_value:10;
> - unsigned pad1:1;
> - unsigned svbi_post_inc_enable:1;
> - unsigned svbi_payload:1;
> - unsigned discard_adjaceny:1;
> - unsigned reorder_enable:1;
> - unsigned pad2:1;
> - } gs6;
> -};
> -
> -
> struct brw_wm_unit_state
> {
> struct thread0 thread0;
> diff --git a/src/mesa/drivers/dri/i965/genX_state_upload.c b/src/mesa/drivers/dri/i965/genX_state_upload.c
> index 3666f68..424d2f8 100644
> --- a/src/mesa/drivers/dri/i965/genX_state_upload.c
> +++ b/src/mesa/drivers/dri/i965/genX_state_upload.c
> @@ -2338,18 +2338,18 @@ static const struct brw_tracked_state genX(sf_clip_viewport) = {
>
> /* ---------------------------------------------------------------------- */
>
> -#if GEN_GEN >= 6
> static void
> genX(upload_gs_state)(struct brw_context *brw)
> {
> - const struct gen_device_info *devinfo = &brw->screen->devinfo;
> + UNUSED struct gl_context *ctx = &brw->ctx;
> + UNUSED const struct gen_device_info *devinfo = &brw->screen->devinfo;
> const struct brw_stage_state *stage_state = &brw->gs.base;
> /* BRW_NEW_GEOMETRY_PROGRAM */
> - bool active = brw->geometry_program;
> + bool active = GEN_GEN >= 6 && brw->geometry_program;
>
> /* BRW_NEW_GS_PROG_DATA */
> struct brw_stage_prog_data *stage_prog_data = stage_state->prog_data;
> - const struct brw_vue_prog_data *vue_prog_data =
> + UNUSED const struct brw_vue_prog_data *vue_prog_data =
> brw_vue_prog_data(stage_prog_data);
> #if GEN_GEN >= 7
> const struct brw_gs_prog_data *gs_prog_data =
> @@ -2383,7 +2383,14 @@ genX(upload_gs_state)(struct brw_context *brw)
> gen7_emit_cs_stall_flush(brw);
> #endif
>
> +#if GEN_GEN >= 6
> brw_batch_emit(brw, GENX(3DSTATE_GS), gs) {
> +#else
> + ctx->NewDriverState |= BRW_NEW_GEN4_UNIT_STATE;
> + brw_state_emit(brw, GENX(GS_STATE), 32, &brw->ff_gs.state_offset, gs) {
> +#endif
> +
> +#if GEN_GEN >= 6
> if (active) {
> INIT_THREAD_DISPATCH_FIELDS(gs, Vertex);
>
> @@ -2434,7 +2441,6 @@ genX(upload_gs_state)(struct brw_context *brw)
>
> #if GEN_GEN < 7
> gs.SOStatisticsEnable = true;
> - gs.RenderingEnabled = 1;
> if (brw->geometry_program->info.has_transform_feedback_varyings)
> gs.SVBIPayloadEnable = true;
>
> @@ -2468,33 +2474,41 @@ genX(upload_gs_state)(struct brw_context *brw)
> gs.VertexURBEntryOutputReadOffset = urb_entry_write_offset;
> gs.VertexURBEntryOutputLength = MAX2(urb_entry_output_length, 1);
> #endif
> -#if GEN_GEN < 7
> - } else if (brw->ff_gs.prog_active) {
> + }
> +#endif
> +
> +#if GEN_GEN <= 6
> + if (!active && brw->ff_gs.prog_active) {
> /* In gen6, transform feedback for the VS stage is done with an
> * ad-hoc GS program. This function provides the needed 3DSTATE_GS
> * for this.
> */
> gs.KernelStartPointer = KSP(brw, brw->ff_gs.prog_offset);
> gs.SingleProgramFlow = true;
> - gs.VectorMaskEnable = true;
> - gs.DispatchGRFStartRegisterForURBData = 2;
> + gs.DispatchGRFStartRegisterForURBData = GEN_GEN == 6 ? 2 : 1;
> gs.VertexURBEntryReadLength = brw->ff_gs.prog_data->urb_read_length;
> - gs.MaximumNumberofThreads = devinfo->max_gs_threads - 1;
> - gs.StatisticsEnable = true;
> - gs.SOStatisticsEnable = true;
> - gs.RenderingEnabled = true;
> +
> +#if GEN_GEN <= 5
> + gs.GRFRegisterCount =
> + DIV_ROUND_UP(brw->ff_gs.prog_data->total_grf, 16) - 1;
> + /* BRW_NEW_URB_FENCE */
> + gs.NumberofURBEntries = brw->urb.nr_gs_entries;
> + gs.URBEntryAllocationSize = brw->urb.vsize - 1;
> + gs.MaximumNumberofThreads = brw->urb.nr_gs_entries >= 8 ? 1 : 0;
> + gs.FloatingPointMode = FLOATING_POINT_MODE_Alternate;
> +#else
> + gs.Enable = true;
> + gs.VectorMaskEnable = true;
> gs.SVBIPayloadEnable = true;
> gs.SVBIPostIncrementEnable = true;
> gs.SVBIPostIncrementValue =
> brw->ff_gs.prog_data->svbi_postincrement_value;
> - gs.Enable = true;
> + gs.SOStatisticsEnable = true;
> + gs.MaximumNumberofThreads = devinfo->max_gs_threads - 1;
> #endif
> - } else {
> - gs.StatisticsEnable = true;
> -#if GEN_GEN < 7
> - gs.RenderingEnabled = true;
> + }
> #endif
> -
> + if (!active && !brw->ff_gs.prog_active) {
> #if GEN_GEN < 8
> gs.DispatchGRFStartRegisterForURBData = 1;
> #if GEN_GEN >= 7
> @@ -2502,6 +2516,16 @@ genX(upload_gs_state)(struct brw_context *brw)
> #endif
> #endif
> }
> +
> +#if GEN_GEN >= 6
> + gs.StatisticsEnable = true;
> +#endif
> +#if GEN_GEN == 5 || GEN_GEN == 6
> + gs.RenderingEnabled = true;
> +#endif
> +#if GEN_GEN <= 5
> + gs.MaximumVPIndex = brw->clip.viewport_count - 1;
> +#endif
> }
>
> #if GEN_GEN == 6
> @@ -2511,17 +2535,23 @@ genX(upload_gs_state)(struct brw_context *brw)
>
> static const struct brw_tracked_state genX(gs_state) = {
> .dirty = {
> - .mesa = (GEN_GEN < 7 ? _NEW_PROGRAM_CONSTANTS : 0),
> + .mesa = (GEN_GEN == 6 ? _NEW_PROGRAM_CONSTANTS : 0),
> .brw = BRW_NEW_BATCH |
> BRW_NEW_BLORP |
> - BRW_NEW_CONTEXT |
> - BRW_NEW_GEOMETRY_PROGRAM |
> - BRW_NEW_GS_PROG_DATA |
> + (GEN_GEN <= 5 ? BRW_NEW_PUSH_CONSTANT_ALLOCATION |
> + BRW_NEW_FF_GS_PROG_DATA |
You don't need BRW_NEW_FF_GS_PROG_DATA here, because...
> + BRW_NEW_PROGRAM_CACHE |
> + BRW_NEW_URB_FENCE |
> + BRW_NEW_VIEWPORT_COUNT
> + : 0) |
> + (GEN_GEN >= 6 ? BRW_NEW_CONTEXT |
> + BRW_NEW_GEOMETRY_PROGRAM |
> + BRW_NEW_GS_PROG_DATA
> + : 0) |
> (GEN_GEN < 7 ? BRW_NEW_FF_GS_PROG_DATA : 0),
...you already have it here. Otherwise,
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
> },
> .emit = genX(upload_gs_state),
> };
> -#endif
>
> /* ---------------------------------------------------------------------- */
>
> @@ -4376,7 +4406,7 @@ genX(init_atoms)(struct brw_context *brw)
> &genX(sf_state),
> &genX(vs_state), /* always required, enabled or not */
> &brw_clip_unit,
> - &brw_gs_unit,
> + &genX(gs_state),
>
> /* Command packets:
> */
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: This is a digitally signed message part.
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170712/fbdc0d8d/attachment-0001.sig>
More information about the mesa-dev
mailing list