This series is Reviewed-by: Rafael Antognolli <rafael.antogno...@intel.com>
On Wed, May 31, 2017 at 01:17:45AM -0700, Kenneth Graunke wrote: > We can just update the gl_transform_feedback_info fields at link time > to make the VUE header fields have the right location and component. > Then we don't need to handle them specially at draw time, which is > expensive. > --- > src/intel/compiler/gen6_gs_visitor.cpp | 13 +--------- > src/mesa/drivers/dri/i965/brw_link.cpp | 36 > +++++++++++++++++++++++++++ > src/mesa/drivers/dri/i965/genX_state_upload.c | 26 +++---------------- > 3 files changed, 41 insertions(+), 34 deletions(-) > > Here are a few cleanups to the SO_DECL handling I wrote a few months ago > while reading through the state upload code. Really, we should move the > SO_DECL_LIST processing to link-time...there's no current API state in > there. Ideally we could just memcpy it all to the batch at draw time... > > diff --git a/src/intel/compiler/gen6_gs_visitor.cpp > b/src/intel/compiler/gen6_gs_visitor.cpp > index fe9f834f0ce..66c69fb058f 100644 > --- a/src/intel/compiler/gen6_gs_visitor.cpp > +++ b/src/intel/compiler/gen6_gs_visitor.cpp > @@ -687,18 +687,7 @@ gen6_gs_visitor::xfb_program(unsigned vertex, unsigned > num_verts) > emit(MOV(dst_reg(this->vertex_output_offset), brw_imm_d(offset))); > memcpy(data.reladdr, &this->vertex_output_offset, sizeof(src_reg)); > data.type = output_reg[varying][0].type; > - > - /* PSIZ, LAYER and VIEWPORT are packed in different channels of the > - * same slot, so make sure we write the appropriate channel > - */ > - if (varying == VARYING_SLOT_PSIZ) > - data.swizzle = BRW_SWIZZLE_WWWW; > - else if (varying == VARYING_SLOT_LAYER) > - data.swizzle = BRW_SWIZZLE_YYYY; > - else if (varying == VARYING_SLOT_VIEWPORT) > - data.swizzle = BRW_SWIZZLE_ZZZZ; > - else > - data.swizzle = > gs_prog_data->transform_feedback_swizzles[binding]; > + data.swizzle = gs_prog_data->transform_feedback_swizzles[binding]; > > /* Write data */ > inst = emit(GS_OPCODE_SVB_WRITE, mrf_reg, data, sol_temp); > diff --git a/src/mesa/drivers/dri/i965/brw_link.cpp > b/src/mesa/drivers/dri/i965/brw_link.cpp > index 57aaf6b9dc0..e9158c596c5 100644 > --- a/src/mesa/drivers/dri/i965/brw_link.cpp > +++ b/src/mesa/drivers/dri/i965/brw_link.cpp > @@ -28,6 +28,7 @@ > #include "compiler/glsl/ir_optimization.h" > #include "compiler/glsl/program.h" > #include "program/program.h" > +#include "main/mtypes.h" > #include "main/shaderapi.h" > #include "main/shaderobj.h" > #include "main/uniforms.h" > @@ -176,6 +177,39 @@ unify_interfaces(struct shader_info **infos) > } > } > > +static void > +update_xfb_info(struct gl_transform_feedback_info *xfb_info) > +{ > + if (!xfb_info) > + return; > + > + for (unsigned i = 0; i < xfb_info->NumOutputs; i++) { > + struct gl_transform_feedback_output *output = &xfb_info->Outputs[i]; > + > + /* The VUE header contains three scalar fields packed together: > + * - gl_PointSize is stored in VARYING_SLOT_PSIZ.w > + * - gl_Layer is stored in VARYING_SLOT_PSIZ.y > + * - gl_ViewportIndex is stored in VARYING_SLOT_PSIZ.z > + */ > + switch (output->OutputRegister) { > + case VARYING_SLOT_LAYER: > + assert(output->NumComponents == 1); > + output->OutputRegister = VARYING_SLOT_PSIZ; > + output->ComponentOffset = 1; > + break; > + case VARYING_SLOT_VIEWPORT: > + assert(output->NumComponents == 1); > + output->OutputRegister = VARYING_SLOT_PSIZ; > + output->ComponentOffset = 2; > + break; > + case VARYING_SLOT_PSIZ: > + assert(output->NumComponents == 1); > + output->ComponentOffset = 3; > + break; > + } > + } > +} > + > extern "C" GLboolean > brw_link_shader(struct gl_context *ctx, struct gl_shader_program *shProg) > { > @@ -199,6 +233,8 @@ brw_link_shader(struct gl_context *ctx, struct > gl_shader_program *shProg) > prog->ShadowSamplers = shader->shadow_samplers; > _mesa_update_shader_textures_used(shProg, prog); > > + update_xfb_info(prog->sh.LinkedTransformFeedback); > + > bool debug_enabled = > (INTEL_DEBUG & intel_debug_flag_for_shader_stage(shader->Stage)); > > diff --git a/src/mesa/drivers/dri/i965/genX_state_upload.c > b/src/mesa/drivers/dri/i965/genX_state_upload.c > index 76d2ea887b1..a2ed2e72710 100644 > --- a/src/mesa/drivers/dri/i965/genX_state_upload.c > +++ b/src/mesa/drivers/dri/i965/genX_state_upload.c > @@ -3087,32 +3087,14 @@ genX(upload_3dstate_so_decl_list)(struct brw_context > *brw, > unsigned decl_buffer_slot = buffer; > assert(stream_id < MAX_VERTEX_STREAMS); > > - /* gl_PointSize is stored in VARYING_SLOT_PSIZ.w > - * gl_Layer is stored in VARYING_SLOT_PSIZ.y > - * gl_ViewportIndex is stored in VARYING_SLOT_PSIZ.z > - */ > - if (varying == VARYING_SLOT_PSIZ) { > - assert(components == 1); > - component_mask <<= 3; > - } else if (varying == VARYING_SLOT_LAYER) { > - assert(components == 1); > - component_mask <<= 1; > - } else if (varying == VARYING_SLOT_VIEWPORT) { > - assert(components == 1); > - component_mask <<= 2; > - } else { > - component_mask <<= linked_xfb_info->Outputs[i].ComponentOffset; > - } > + component_mask <<= linked_xfb_info->Outputs[i].ComponentOffset; > > buffer_mask[stream_id] |= 1 << buffer; > > + assert(vue_map->varying_to_slot[varying] >= 0); > + > decl.OutputBufferSlot = decl_buffer_slot; > - if (varying == VARYING_SLOT_LAYER || varying == VARYING_SLOT_VIEWPORT) > { > - decl.RegisterIndex = vue_map->varying_to_slot[VARYING_SLOT_PSIZ]; > - } else { > - assert(vue_map->varying_to_slot[varying] >= 0); > - decl.RegisterIndex = vue_map->varying_to_slot[varying]; > - } > + decl.RegisterIndex = vue_map->varying_to_slot[varying]; > decl.ComponentMask = component_mask; > > /* Mesa doesn't store entries for gl_SkipComponents in the Outputs[] > -- > 2.13.0 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev