mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 15:20:10 +01:00
mesa: split transform feedback buffer into its own struct
This will be used in a following patch to implement interface query support for TRANSFORM_FEEDBACK_BUFFER. Reviewed-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
258299d87a
commit
cf039a309a
7 changed files with 34 additions and 25 deletions
|
|
@ -722,7 +722,7 @@ tfeedback_decl::store(struct gl_context *ctx, struct gl_shader_program *prog,
|
|||
|
||||
/* Handle gl_SkipComponents. */
|
||||
if (this->skip_components) {
|
||||
info->BufferStride[buffer] += this->skip_components;
|
||||
info->Buffers[buffer].Stride += this->skip_components;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -734,7 +734,7 @@ tfeedback_decl::store(struct gl_context *ctx, struct gl_shader_program *prog,
|
|||
* and the buffer mode is INTERLEAVED_ATTRIBS_EXT.
|
||||
*/
|
||||
if (prog->TransformFeedback.BufferMode == GL_INTERLEAVED_ATTRIBS &&
|
||||
info->BufferStride[buffer] + this->num_components() >
|
||||
info->Buffers[buffer].Stride + this->num_components() >
|
||||
ctx->Const.MaxTransformFeedbackInterleavedComponents) {
|
||||
linker_error(prog, "The MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS "
|
||||
"limit has been exceeded.");
|
||||
|
|
@ -752,10 +752,11 @@ tfeedback_decl::store(struct gl_context *ctx, struct gl_shader_program *prog,
|
|||
info->Outputs[info->NumOutputs].NumComponents = output_size;
|
||||
info->Outputs[info->NumOutputs].StreamId = stream_id;
|
||||
info->Outputs[info->NumOutputs].OutputBuffer = buffer;
|
||||
info->Outputs[info->NumOutputs].DstOffset = info->BufferStride[buffer];
|
||||
info->Outputs[info->NumOutputs].DstOffset =
|
||||
info->Buffers[buffer].Stride;
|
||||
++info->NumOutputs;
|
||||
info->BufferStride[buffer] += output_size;
|
||||
info->BufferStream[buffer] = this->stream_id;
|
||||
info->Buffers[buffer].Stride += output_size;
|
||||
info->Buffers[buffer].Stream = this->stream_id;
|
||||
num_components -= output_size;
|
||||
location++;
|
||||
location_frac = 0;
|
||||
|
|
|
|||
|
|
@ -69,13 +69,13 @@ gen6_update_sol_surfaces(struct brw_context *brw)
|
|||
brw, xfb_obj->Buffers[buffer],
|
||||
&brw->gs.base.surf_offset[surf_index],
|
||||
linked_xfb_info->Outputs[i].NumComponents,
|
||||
linked_xfb_info->BufferStride[buffer], buffer_offset);
|
||||
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->BufferStride[buffer], buffer_offset);
|
||||
linked_xfb_info->Buffers[buffer].Stride, buffer_offset);
|
||||
}
|
||||
} else {
|
||||
if (!brw->geometry_program)
|
||||
|
|
|
|||
|
|
@ -70,7 +70,7 @@ upload_3dstate_so_buffers(struct brw_context *brw)
|
|||
continue;
|
||||
}
|
||||
|
||||
stride = linked_xfb_info->BufferStride[i] * 4;
|
||||
stride = linked_xfb_info->Buffers[i].Stride * 4;
|
||||
|
||||
start = xfb_obj->Offset[i];
|
||||
assert(start % 4 == 0);
|
||||
|
|
|
|||
|
|
@ -139,13 +139,13 @@ gen8_upload_3dstate_streamout(struct brw_context *brw, bool active,
|
|||
|
||||
/* Set buffer pitches; 0 means unbound. */
|
||||
if (xfb_obj->Buffers[0])
|
||||
dw3 |= linked_xfb_info->BufferStride[0] * 4;
|
||||
dw3 |= linked_xfb_info->Buffers[0].Stride * 4;
|
||||
if (xfb_obj->Buffers[1])
|
||||
dw3 |= (linked_xfb_info->BufferStride[1] * 4) << 16;
|
||||
dw3 |= (linked_xfb_info->Buffers[1].Stride * 4) << 16;
|
||||
if (xfb_obj->Buffers[2])
|
||||
dw4 |= linked_xfb_info->BufferStride[2] * 4;
|
||||
dw4 |= linked_xfb_info->Buffers[2].Stride * 4;
|
||||
if (xfb_obj->Buffers[3])
|
||||
dw4 |= (linked_xfb_info->BufferStride[3] * 4) << 16;
|
||||
dw4 |= (linked_xfb_info->Buffers[3].Stride * 4) << 16;
|
||||
}
|
||||
|
||||
BEGIN_BATCH(5);
|
||||
|
|
|
|||
|
|
@ -1644,6 +1644,24 @@ struct gl_transform_feedback_output
|
|||
};
|
||||
|
||||
|
||||
struct gl_transform_feedback_buffer
|
||||
{
|
||||
unsigned Binding;
|
||||
|
||||
/**
|
||||
* Total number of components stored in each buffer. This may be used by
|
||||
* hardware back-ends to determine the correct stride when interleaving
|
||||
* multiple transform feedback outputs in the same buffer.
|
||||
*/
|
||||
unsigned Stride;
|
||||
|
||||
/**
|
||||
* Which transform feedback stream this buffer binding is associated with.
|
||||
*/
|
||||
unsigned Stream;
|
||||
};
|
||||
|
||||
|
||||
/** Post-link transform feedback info. */
|
||||
struct gl_transform_feedback_info
|
||||
{
|
||||
|
|
@ -1661,17 +1679,7 @@ struct gl_transform_feedback_info
|
|||
struct gl_transform_feedback_varying_info *Varyings;
|
||||
GLint NumVarying;
|
||||
|
||||
/**
|
||||
* Total number of components stored in each buffer. This may be used by
|
||||
* hardware back-ends to determine the correct stride when interleaving
|
||||
* multiple transform feedback outputs in the same buffer.
|
||||
*/
|
||||
unsigned BufferStride[MAX_FEEDBACK_BUFFERS];
|
||||
|
||||
/**
|
||||
* Which transform feedback stream this buffer binding is associated with.
|
||||
*/
|
||||
unsigned BufferStream[MAX_FEEDBACK_BUFFERS];
|
||||
struct gl_transform_feedback_buffer Buffers[MAX_FEEDBACK_BUFFERS];
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -356,7 +356,7 @@ _mesa_compute_max_transform_feedback_vertices(struct gl_context *ctx,
|
|||
|
||||
for (i = 0; i < ctx->Const.MaxTransformFeedbackBuffers; i++) {
|
||||
if ((info->ActiveBuffers >> i) & 1) {
|
||||
unsigned stride = info->BufferStride[i];
|
||||
unsigned stride = info->Buffers[i].Stride;
|
||||
unsigned max_for_this_buffer;
|
||||
|
||||
/* Skip any inactive buffers, which have a stride of 0. */
|
||||
|
|
|
|||
|
|
@ -6861,7 +6861,7 @@ st_translate_stream_output_info(glsl_to_tgsi_visitor *glsl_to_tgsi,
|
|||
}
|
||||
|
||||
for (i = 0; i < PIPE_MAX_SO_BUFFERS; i++) {
|
||||
so->stride[i] = info->BufferStride[i];
|
||||
so->stride[i] = info->Buffers[i].Stride;
|
||||
}
|
||||
so->num_outputs = info->NumOutputs;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue