From 072bcb8edc54b321685aa29a7e03379a23d073cd Mon Sep 17 00:00:00 2001 From: Rafael Antognolli Date: Mon, 20 Mar 2017 10:32:53 -0700 Subject: [PATCH] i965: Port Gen7+ 3DSTATE_SBE state to genxml. Emit 3DSTATE_SBE on Gen7+ using brw_batch_emit helper, that uses pack structs from genxml. v2: - Use ACTIVE_COMPONENT_XYZW from gen9.xml. v3: - Style fixes (Ken) v4: #undef unconditionally (Ken) Signed-off-by: Rafael Antognolli Reviewed-by: Kenneth Graunke --- src/mesa/drivers/dri/i965/Makefile.sources | 2 - src/mesa/drivers/dri/i965/brw_state.h | 2 - src/mesa/drivers/dri/i965/gen7_sf_state.c | 109 ------------------ src/mesa/drivers/dri/i965/gen8_sf_state.c | 153 -------------------------- src/mesa/drivers/dri/i965/genX_state_upload.c | 124 +++++++++++++++++++-- 5 files changed, 116 insertions(+), 274 deletions(-) delete mode 100644 src/mesa/drivers/dri/i965/gen7_sf_state.c delete mode 100644 src/mesa/drivers/dri/i965/gen8_sf_state.c diff --git a/src/mesa/drivers/dri/i965/Makefile.sources b/src/mesa/drivers/dri/i965/Makefile.sources index b085251..81759ed 100644 --- a/src/mesa/drivers/dri/i965/Makefile.sources +++ b/src/mesa/drivers/dri/i965/Makefile.sources @@ -97,7 +97,6 @@ i965_FILES = \ gen7_hs_state.c \ gen7_l3_state.c \ gen7_misc_state.c \ - gen7_sf_state.c \ gen7_sol_state.c \ gen7_te_state.c \ gen7_urb.c \ @@ -113,7 +112,6 @@ i965_FILES = \ gen8_hs_state.c \ gen8_multisample_state.c \ gen8_ps_state.c \ - gen8_sf_state.c \ gen8_sol_state.c \ gen8_surface_state.c \ gen8_viewport_state.c \ diff --git a/src/mesa/drivers/dri/i965/brw_state.h b/src/mesa/drivers/dri/i965/brw_state.h index 594757c..bc68c2c 100644 --- a/src/mesa/drivers/dri/i965/brw_state.h +++ b/src/mesa/drivers/dri/i965/brw_state.h @@ -134,7 +134,6 @@ extern const struct brw_tracked_state gen7_hs_state; extern const struct brw_tracked_state gen7_l3_state; extern const struct brw_tracked_state gen7_ps_state; extern const struct brw_tracked_state gen7_push_constant_space; -extern const struct brw_tracked_state gen7_sbe_state; extern const struct brw_tracked_state gen7_sf_clip_viewport; extern const struct brw_tracked_state gen7_sol_state; extern const struct brw_tracked_state gen7_te_state; @@ -154,7 +153,6 @@ extern const struct brw_tracked_state gen8_ps_blend; extern const struct brw_tracked_state gen8_ps_extra; extern const struct brw_tracked_state gen8_ps_state; extern const struct brw_tracked_state gen8_wm_state; -extern const struct brw_tracked_state gen8_sbe_state; extern const struct brw_tracked_state gen8_sf_clip_viewport; extern const struct brw_tracked_state gen8_vertices; extern const struct brw_tracked_state gen8_vf_topology; diff --git a/src/mesa/drivers/dri/i965/gen7_sf_state.c b/src/mesa/drivers/dri/i965/gen7_sf_state.c deleted file mode 100644 index 7ab8a99..0000000 --- a/src/mesa/drivers/dri/i965/gen7_sf_state.c +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright © 2011 Intel Corporation - * - * 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 AUTHORS OR COPYRIGHT HOLDERS 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. - */ - -#include "brw_context.h" -#include "brw_state.h" -#include "brw_defines.h" -#include "brw_util.h" -#include "main/macros.h" -#include "main/fbobject.h" -#include "main/framebuffer.h" -#include "intel_batchbuffer.h" - -static void -upload_sbe_state(struct brw_context *brw) -{ - struct gl_context *ctx = &brw->ctx; - /* BRW_NEW_FS_PROG_DATA */ - const struct brw_wm_prog_data *wm_prog_data = - brw_wm_prog_data(brw->wm.base.prog_data); - uint32_t num_outputs = wm_prog_data->num_varying_inputs; - uint32_t dw1; - uint32_t point_sprite_enables; - int i; - uint16_t attr_overrides[16]; - /* _NEW_BUFFERS */ - bool render_to_fbo = _mesa_is_user_fbo(ctx->DrawBuffer); - uint32_t point_sprite_origin; - - /* FINISHME: Attribute Swizzle Control Mode? */ - dw1 = GEN7_SBE_SWIZZLE_ENABLE | num_outputs << GEN7_SBE_NUM_OUTPUTS_SHIFT; - - /* _NEW_POINT - * - * Window coordinates in an FBO are inverted, which means point - * sprite origin must be inverted. - */ - if ((ctx->Point.SpriteOrigin == GL_LOWER_LEFT) != render_to_fbo) { - point_sprite_origin = GEN6_SF_POINT_SPRITE_LOWERLEFT; - } else { - point_sprite_origin = GEN6_SF_POINT_SPRITE_UPPERLEFT; - } - dw1 |= point_sprite_origin; - - /* _NEW_POINT | _NEW_LIGHT | _NEW_PROGRAM, - * BRW_NEW_FS_PROG_DATA | BRW_NEW_FRAGMENT_PROGRAM | - * BRW_NEW_GS_PROG_DATA | BRW_NEW_PRIMITIVE | BRW_NEW_TES_PROG_DATA | - * BRW_NEW_VUE_MAP_GEOM_OUT - */ - uint32_t urb_entry_read_length; - uint32_t urb_entry_read_offset; - calculate_attr_overrides(brw, attr_overrides, &point_sprite_enables, - &urb_entry_read_length, &urb_entry_read_offset); - dw1 |= urb_entry_read_length << GEN7_SBE_URB_ENTRY_READ_LENGTH_SHIFT | - urb_entry_read_offset << GEN7_SBE_URB_ENTRY_READ_OFFSET_SHIFT; - - BEGIN_BATCH(14); - OUT_BATCH(_3DSTATE_SBE << 16 | (14 - 2)); - OUT_BATCH(dw1); - - /* Output dwords 2 through 9 */ - for (i = 0; i < 8; i++) { - OUT_BATCH(attr_overrides[i * 2] | attr_overrides[i * 2 + 1] << 16); - } - - OUT_BATCH(point_sprite_enables); /* dw10 */ - OUT_BATCH(wm_prog_data->flat_inputs); - OUT_BATCH(0); /* wrapshortest enables 0-7 */ - OUT_BATCH(0); /* wrapshortest enables 8-15 */ - ADVANCE_BATCH(); -} - -const struct brw_tracked_state gen7_sbe_state = { - .dirty = { - .mesa = _NEW_BUFFERS | - _NEW_LIGHT | - _NEW_POINT | - _NEW_POLYGON | - _NEW_PROGRAM, - .brw = BRW_NEW_BLORP | - BRW_NEW_CONTEXT | - BRW_NEW_FRAGMENT_PROGRAM | - BRW_NEW_FS_PROG_DATA | - BRW_NEW_GS_PROG_DATA | - BRW_NEW_TES_PROG_DATA | - BRW_NEW_PRIMITIVE | - BRW_NEW_VUE_MAP_GEOM_OUT, - }, - .emit = upload_sbe_state, -}; diff --git a/src/mesa/drivers/dri/i965/gen8_sf_state.c b/src/mesa/drivers/dri/i965/gen8_sf_state.c deleted file mode 100644 index 3b1dd61..0000000 --- a/src/mesa/drivers/dri/i965/gen8_sf_state.c +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Copyright © 2011 Intel Corporation - * - * 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 AUTHORS OR COPYRIGHT HOLDERS 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. - */ - -#include "compiler/nir/nir.h" -#include "brw_context.h" -#include "brw_state.h" -#include "brw_defines.h" -#include "brw_util.h" -#include "main/macros.h" -#include "main/fbobject.h" -#include "intel_batchbuffer.h" - -static void -upload_sbe(struct brw_context *brw) -{ - struct gl_context *ctx = &brw->ctx; - /* BRW_NEW_FS_PROG_DATA */ - const struct brw_wm_prog_data *wm_prog_data = - brw_wm_prog_data(brw->wm.base.prog_data); - uint32_t num_outputs = wm_prog_data->num_varying_inputs; - uint16_t attr_overrides[VARYING_SLOT_MAX]; - uint32_t urb_entry_read_length; - uint32_t urb_entry_read_offset; - uint32_t point_sprite_enables; - int sbe_cmd_length; - - uint32_t dw1 = - GEN7_SBE_SWIZZLE_ENABLE | - num_outputs << GEN7_SBE_NUM_OUTPUTS_SHIFT; - uint32_t dw4 = 0; - uint32_t dw5 = 0; - - /* _NEW_BUFFERS */ - bool render_to_fbo = _mesa_is_user_fbo(ctx->DrawBuffer); - - /* _NEW_POINT - * - * Window coordinates in an FBO are inverted, which means point - * sprite origin must be inverted. - */ - if ((ctx->Point.SpriteOrigin == GL_LOWER_LEFT) != render_to_fbo) - dw1 |= GEN6_SF_POINT_SPRITE_LOWERLEFT; - else - dw1 |= GEN6_SF_POINT_SPRITE_UPPERLEFT; - - /* _NEW_POINT | _NEW_LIGHT | _NEW_PROGRAM, - * BRW_NEW_FS_PROG_DATA | BRW_NEW_FRAGMENT_PROGRAM | - * BRW_NEW_GS_PROG_DATA | BRW_NEW_PRIMITIVE | BRW_NEW_TES_PROG_DATA | - * BRW_NEW_VUE_MAP_GEOM_OUT - */ - calculate_attr_overrides(brw, attr_overrides, - &point_sprite_enables, - &urb_entry_read_length, - &urb_entry_read_offset); - - /* Typically, the URB entry read length and offset should be programmed in - * 3DSTATE_VS and 3DSTATE_GS; SBE inherits it from the last active stage - * which produces geometry. However, we don't know the proper value until - * we call calculate_attr_overrides(). - * - * To fit with our existing code, we override the inherited values and - * specify it here directly, as we did on previous generations. - */ - dw1 |= - urb_entry_read_length << GEN7_SBE_URB_ENTRY_READ_LENGTH_SHIFT | - urb_entry_read_offset << GEN8_SBE_URB_ENTRY_READ_OFFSET_SHIFT | - GEN8_SBE_FORCE_URB_ENTRY_READ_LENGTH | - GEN8_SBE_FORCE_URB_ENTRY_READ_OFFSET; - - if (brw->gen == 8) { - sbe_cmd_length = 4; - } else { - sbe_cmd_length = 6; - - /* prepare the active component dwords */ - int input_index = 0; - for (int attr = 0; attr < VARYING_SLOT_MAX; attr++) { - if (!(brw->fragment_program->info.inputs_read & - BITFIELD64_BIT(attr))) { - continue; - } - - assert(input_index < 32); - - if (input_index < 16) - dw4 |= (GEN9_SBE_ACTIVE_COMPONENT_XYZW << (input_index << 1)); - else - dw5 |= (GEN9_SBE_ACTIVE_COMPONENT_XYZW << ((input_index - 16) << 1)); - - ++input_index; - } - } - BEGIN_BATCH(sbe_cmd_length); - OUT_BATCH(_3DSTATE_SBE << 16 | (sbe_cmd_length - 2)); - OUT_BATCH(dw1); - OUT_BATCH(point_sprite_enables); - OUT_BATCH(wm_prog_data->flat_inputs); - if (sbe_cmd_length >= 6) { - OUT_BATCH(dw4); - OUT_BATCH(dw5); - } - ADVANCE_BATCH(); - - BEGIN_BATCH(11); - OUT_BATCH(_3DSTATE_SBE_SWIZ << 16 | (11 - 2)); - - /* Output DWords 1 through 8: */ - for (int i = 0; i < 8; i++) { - OUT_BATCH(attr_overrides[i * 2] | attr_overrides[i * 2 + 1] << 16); - } - - OUT_BATCH(0); /* wrapshortest enables 0-7 */ - OUT_BATCH(0); /* wrapshortest enables 8-15 */ - ADVANCE_BATCH(); -} - -const struct brw_tracked_state gen8_sbe_state = { - .dirty = { - .mesa = _NEW_BUFFERS | - _NEW_LIGHT | - _NEW_POINT | - _NEW_POLYGON | - _NEW_PROGRAM, - .brw = BRW_NEW_BLORP | - BRW_NEW_CONTEXT | - BRW_NEW_FRAGMENT_PROGRAM | - BRW_NEW_FS_PROG_DATA | - BRW_NEW_GS_PROG_DATA | - BRW_NEW_TES_PROG_DATA | - BRW_NEW_VUE_MAP_GEOM_OUT, - }, - .emit = upload_sbe, -}; diff --git a/src/mesa/drivers/dri/i965/genX_state_upload.c b/src/mesa/drivers/dri/i965/genX_state_upload.c index 84d2271..575be7e 100644 --- a/src/mesa/drivers/dri/i965/genX_state_upload.c +++ b/src/mesa/drivers/dri/i965/genX_state_upload.c @@ -112,7 +112,7 @@ __gen_combine_address(struct brw_context *brw, void *location, _brw_cmd_pack(cmd)(brw, (void *)_dst, &name), \ _dst = NULL) -#if GEN_GEN == 6 +#if GEN_GEN >= 6 /** * Determine the appropriate attribute override value to store into the * 3DSTATE_SF structure for a given fragment shader attribute. The attribute @@ -339,11 +339,6 @@ genX(calculate_attr_overrides)(const struct brw_context *brw, */ *urb_entry_read_length = DIV_ROUND_UP(max_source_attr + 1, 2); } -#endif - -/* ---------------------------------------------------------------------- */ - -#if GEN_GEN >= 6 /* ---------------------------------------------------------------------- */ @@ -756,6 +751,119 @@ static const struct brw_tracked_state genX(sf_state) = { /* ---------------------------------------------------------------------- */ +#if GEN_GEN >= 7 +static void +genX(upload_sbe)(struct brw_context *brw) +{ + struct gl_context *ctx = &brw->ctx; + /* BRW_NEW_FS_PROG_DATA */ + const struct brw_wm_prog_data *wm_prog_data = + brw_wm_prog_data(brw->wm.base.prog_data); +#if GEN_GEN >= 8 + struct GENX(SF_OUTPUT_ATTRIBUTE_DETAIL) attr_overrides[16] = { { 0 } }; +#else +#define attr_overrides sbe.Attribute +#endif + uint32_t urb_entry_read_length; + uint32_t urb_entry_read_offset; + uint32_t point_sprite_enables; + + brw_batch_emit(brw, GENX(3DSTATE_SBE), sbe) { + sbe.AttributeSwizzleEnable = true; + sbe.NumberofSFOutputAttributes = wm_prog_data->num_varying_inputs; + + /* _NEW_BUFFERS */ + bool render_to_fbo = _mesa_is_user_fbo(ctx->DrawBuffer); + + /* _NEW_POINT + * + * Window coordinates in an FBO are inverted, which means point + * sprite origin must be inverted. + */ + if ((ctx->Point.SpriteOrigin == GL_LOWER_LEFT) != render_to_fbo) + sbe.PointSpriteTextureCoordinateOrigin = LOWERLEFT; + else + sbe.PointSpriteTextureCoordinateOrigin = UPPERLEFT; + + /* _NEW_POINT | _NEW_LIGHT | _NEW_PROGRAM, + * BRW_NEW_FS_PROG_DATA | BRW_NEW_FRAGMENT_PROGRAM | + * BRW_NEW_GS_PROG_DATA | BRW_NEW_PRIMITIVE | BRW_NEW_TES_PROG_DATA | + * BRW_NEW_VUE_MAP_GEOM_OUT + */ + genX(calculate_attr_overrides)(brw, + attr_overrides, + &point_sprite_enables, + &urb_entry_read_length, + &urb_entry_read_offset); + + /* Typically, the URB entry read length and offset should be programmed + * in 3DSTATE_VS and 3DSTATE_GS; SBE inherits it from the last active + * stage which produces geometry. However, we don't know the proper + * value until we call calculate_attr_overrides(). + * + * To fit with our existing code, we override the inherited values and + * specify it here directly, as we did on previous generations. + */ + sbe.VertexURBEntryReadLength = urb_entry_read_length; + sbe.VertexURBEntryReadOffset = urb_entry_read_offset; + sbe.PointSpriteTextureCoordinateEnable = point_sprite_enables; + sbe.ConstantInterpolationEnable = wm_prog_data->flat_inputs; + +#if GEN_GEN >= 8 + sbe.ForceVertexURBEntryReadLength = true; + sbe.ForceVertexURBEntryReadOffset = true; +#endif + +#if GEN_GEN >= 9 + /* prepare the active component dwords */ + int input_index = 0; + for (int attr = 0; attr < VARYING_SLOT_MAX; attr++) { + if (!(brw->fragment_program->info.inputs_read & + BITFIELD64_BIT(attr))) { + continue; + } + + assert(input_index < 32); + + sbe.AttributeActiveComponentFormat[input_index] = ACTIVE_COMPONENT_XYZW; + ++input_index; + } +#endif + } + +#if GEN_GEN >= 8 + brw_batch_emit(brw, GENX(3DSTATE_SBE_SWIZ), sbes) { + for (int i = 0; i < 16; i++) + sbes.Attribute[i] = attr_overrides[i]; + } +#endif + +#undef attr_overrides +} + +static const struct brw_tracked_state genX(sbe_state) = { + .dirty = { + .mesa = _NEW_BUFFERS | + _NEW_LIGHT | + _NEW_POINT | + _NEW_POLYGON | + _NEW_PROGRAM, + .brw = BRW_NEW_BLORP | + BRW_NEW_CONTEXT | + BRW_NEW_FRAGMENT_PROGRAM | + BRW_NEW_FS_PROG_DATA | + BRW_NEW_GS_PROG_DATA | + BRW_NEW_TES_PROG_DATA | + BRW_NEW_VUE_MAP_GEOM_OUT | + (GEN_GEN == 7 ? BRW_NEW_PRIMITIVE + : 0), + }, + .emit = genX(upload_sbe), +}; +#endif + +/* ---------------------------------------------------------------------- */ + #if GEN_GEN >= 8 static void genX(upload_raster)(struct brw_context *brw) @@ -1072,7 +1180,7 @@ genX(init_atoms)(struct brw_context *brw) &gen7_gs_state, &gen7_sol_state, &genX(clip_state), - &gen7_sbe_state, + &genX(sbe_state), &genX(sf_state), &gen7_wm_state, &gen7_ps_state, @@ -1160,7 +1268,7 @@ genX(init_atoms)(struct brw_context *brw) &gen7_sol_state, &genX(clip_state), &genX(raster_state), - &gen8_sbe_state, + &genX(sbe_state), &genX(sf_state), &gen8_ps_blend, &gen8_ps_extra, -- 2.7.4