i965: Move SOL PSIZ hacks from draw time to link time.
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. Reviewed-by: Rafael Antognolli <rafael.antognolli@intel.com>
This commit is contained in:
@@ -687,17 +687,6 @@ 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];
|
||||
|
||||
/* Write data */
|
||||
|
@@ -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));
|
||||
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
buffer_mask[stream_id] |= 1 << buffer;
|
||||
|
||||
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.OutputBufferSlot = decl_buffer_slot;
|
||||
decl.RegisterIndex = vue_map->varying_to_slot[varying];
|
||||
}
|
||||
decl.ComponentMask = component_mask;
|
||||
|
||||
/* Mesa doesn't store entries for gl_SkipComponents in the Outputs[]
|
||||
|
Reference in New Issue
Block a user