[virglrenderer-devel] [PATCH 7/9] renderer: refactor draw time ubo binding
Dave Airlie
airlied at gmail.com
Thu Jun 14 02:01:50 UTC 2018
From: Dave Airlie <airlied at redhat.com>
This refactors out the shader type code into a separate function,
makes it easier to add compute support later.
---
src/vrend_renderer.c | 77 ++++++++++++++++++++++++++++------------------------
1 file changed, 41 insertions(+), 36 deletions(-)
diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c
index be3bd64..42e83cd 100644
--- a/src/vrend_renderer.c
+++ b/src/vrend_renderer.c
@@ -3034,51 +3034,56 @@ static void vrend_draw_bind_samplers(struct vrend_context *ctx)
ctx->sub->sampler_state_dirty = false;
}
-static void vrend_draw_bind_ubo(struct vrend_context *ctx)
+static void vrend_draw_bind_ubo_shader(struct vrend_context *ctx,
+ int shader_type, int *ubo_id)
{
- int i;
- int ubo_id;
- int shader_type;
+ uint32_t mask;
+ int shader_ubo_idx;
+ struct pipe_constant_buffer *cb;
+ struct vrend_resource *res;
+ struct vrend_shader_info* sinfo;
- ubo_id = 0;
- for (shader_type = PIPE_SHADER_VERTEX; shader_type <= ctx->sub->last_shader_idx; shader_type++) {
- uint32_t mask;
- int shader_ubo_idx;
- struct pipe_constant_buffer *cb;
- struct vrend_resource *res;
- struct vrend_shader_info* sinfo;
+ if (!ctx->sub->const_bufs_used_mask[shader_type])
+ return;
- if (!ctx->sub->const_bufs_used_mask[shader_type])
- continue;
+ if (!ctx->sub->prog->ubo_locs[shader_type])
+ return;
- if (!ctx->sub->prog->ubo_locs[shader_type])
- continue;
+ sinfo = &ctx->sub->prog->ss[shader_type]->sel->sinfo;
- sinfo = &ctx->sub->prog->ss[shader_type]->sel->sinfo;
+ mask = ctx->sub->const_bufs_used_mask[shader_type];
+ while (mask) {
+ /* The const_bufs_used_mask stores the gallium uniform buffer indices */
+ int i = u_bit_scan(&mask);
- mask = ctx->sub->const_bufs_used_mask[shader_type];
- while (mask) {
- /* The const_bufs_used_mask stores the gallium uniform buffer indices */
- i = u_bit_scan(&mask);
+ /* The cbs array is indexed using the gallium uniform buffer index */
+ cb = &ctx->sub->cbs[shader_type][i];
+ res = (struct vrend_resource *)cb->buffer;
- /* The cbs array is indexed using the gallium uniform buffer index */
- cb = &ctx->sub->cbs[shader_type][i];
- res = (struct vrend_resource *)cb->buffer;
+ /* Find the index of the uniform buffer in the array of shader ubo data */
+ for (shader_ubo_idx = 0; shader_ubo_idx < sinfo->num_ubos; shader_ubo_idx++) {
+ if (sinfo->ubo_idx[shader_ubo_idx] == i)
+ break;
+ }
+ if (shader_ubo_idx == sinfo->num_ubos)
+ continue;
- /* Find the index of the uniform buffer in the array of shader ubo data */
- for (shader_ubo_idx = 0; shader_ubo_idx < sinfo->num_ubos; shader_ubo_idx++) {
- if (sinfo->ubo_idx[shader_ubo_idx] == i)
- break;
- }
- if (shader_ubo_idx == sinfo->num_ubos)
- continue;
+ glBindBufferRange(GL_UNIFORM_BUFFER, *ubo_id, res->id,
+ cb->buffer_offset, cb->buffer_size);
+ /* The ubo_locs array is indexed using the shader ubo index */
+ glUniformBlockBinding(ctx->sub->prog->id, ctx->sub->prog->ubo_locs[shader_type][shader_ubo_idx], *ubo_id);
+ (*ubo_id)++;
+ }
+}
- glBindBufferRange(GL_UNIFORM_BUFFER, ubo_id, res->id,
- cb->buffer_offset, cb->buffer_size);
- /* The ubo_locs array is indexed using the shader ubo index */
- glUniformBlockBinding(ctx->sub->prog->id, ctx->sub->prog->ubo_locs[shader_type][shader_ubo_idx], ubo_id);
- ubo_id++;
- }
+static void vrend_draw_bind_ubo(struct vrend_context *ctx)
+{
+ int ubo_id;
+ int shader_type;
+
+ ubo_id = 0;
+ for (shader_type = PIPE_SHADER_VERTEX; shader_type <= ctx->sub->last_shader_idx; shader_type++) {
+ vrend_draw_bind_ubo_shader(ctx, shader_type, &ubo_id);
}
}
--
2.14.3
More information about the virglrenderer-devel
mailing list