static void gen6_update_sol_surfaces(struct brw_context *brw) { struct gl_context *ctx = &brw->ctx; /* BRW_NEW_TRANSFORM_FEEDBACK */ struct gl_transform_feedback_object *xfb_obj = ctx->TransformFeedback.CurrentObject; const struct gl_shader_program *shaderprog; const struct gl_transform_feedback_info *linked_xfb_info; int i; if (brw->geometry_program) { /* BRW_NEW_GEOMETRY_PROGRAM */ shaderprog = ctx->_Shader->CurrentProgram[MESA_SHADER_GEOMETRY]; } else { /* BRW_NEW_VERTEX_PROGRAM */ shaderprog = ctx->_Shader->CurrentProgram[MESA_SHADER_VERTEX]; } linked_xfb_info = &shaderprog->LinkedTransformFeedback; for (i = 0; i < BRW_MAX_SOL_BINDINGS; ++i) { const int surf_index = SURF_INDEX_GEN6_SOL_BINDING(i); if (_mesa_is_xfb_active_and_unpaused(ctx) && i < linked_xfb_info->NumOutputs) { unsigned buffer = linked_xfb_info->Outputs[i].OutputBuffer; unsigned buffer_offset = xfb_obj->Offset[buffer] / 4 + linked_xfb_info->Outputs[i].DstOffset; if (brw->geometry_program) { brw_update_sol_surface( brw, xfb_obj->Buffers[buffer], &brw->gs.base.surf_offset[surf_index], linked_xfb_info->Outputs[i].NumComponents, linked_xfb_info->Buffers[buffer].Stride, buffer_offset); } else { brw_update_sol_surface( brw, xfb_obj->Buffers[buffer], &brw->ff_gs.surf_offset[surf_index], linked_xfb_info->Outputs[i].NumComponents, linked_xfb_info->Buffers[buffer].Stride, buffer_offset); } } else { if (!brw->geometry_program) brw->ff_gs.surf_offset[surf_index] = 0; else brw->gs.base.surf_offset[surf_index] = 0; } } brw->ctx.NewDriverState |= BRW_NEW_SURFACES; }
static void gen6_update_sol_surfaces(struct brw_context *brw) { struct gl_context *ctx = &brw->intel.ctx; /* _NEW_TRANSFORM_FEEDBACK */ struct gl_transform_feedback_object *xfb_obj = ctx->TransformFeedback.CurrentObject; /* BRW_NEW_VERTEX_PROGRAM */ const struct gl_shader_program *shaderprog = ctx->Shader.CurrentVertexProgram; const struct gl_transform_feedback_info *linked_xfb_info = &shaderprog->LinkedTransformFeedback; int i; for (i = 0; i < BRW_MAX_SOL_BINDINGS; ++i) { const int surf_index = SURF_INDEX_SOL_BINDING(i); if (xfb_obj->Active && !xfb_obj->Paused && i < linked_xfb_info->NumOutputs) { unsigned buffer = linked_xfb_info->Outputs[i].OutputBuffer; unsigned buffer_offset = xfb_obj->Offset[buffer] / 4 + linked_xfb_info->Outputs[i].DstOffset; brw_update_sol_surface( brw, xfb_obj->Buffers[buffer], &brw->gs.surf_offset[surf_index], linked_xfb_info->Outputs[i].NumComponents, linked_xfb_info->BufferStride[buffer], buffer_offset); } else { brw->gs.surf_offset[surf_index] = 0; } } brw->state.dirty.brw |= BRW_NEW_SURFACES; }