[virglrenderer-devel] [PATCH v2] vrend: Associate host UBOs with the correct gallium uniform buffers
Joe Kniss
djmk at google.com
Tue May 8 22:19:09 UTC 2018
Looks good to me.
On Fri, May 4, 2018 at 4:00 AM, Elie Tournier <tournier.elie at gmail.com> wrote:
> On Thu, May 03, 2018 at 06:33:48PM +0300, Alexandros Frantzis wrote:
>> Take into account the gallium uniform buffer indices when associating
>> host UBOs with gallium uniform buffers.
>>
>> Previously the code disregarded the gallium uniform buffer indices,
>> leading, under specific circumstances, to the provision of incorrect
>> data to the shaders. The problem manifested typically when a context
>> contained active UBOs which were not accessed by a particular shader,
>> but ended up being used instead of the correct UBOs for that shader.
>> This occurred, for example, when running the dEQP-GLES3.functional.ubo.*
>> in batch mode, in which case left over UBOs from previous tests would
>> cause subsequent tests to fail.
>>
>> Fixes:
>> dEQP-GLES3.functional.ubo.* when run in batch mode
>>
> Tested-by: Elie Tournier <elie.tournier at collabora.com>
>> Signed-off-by: Alexandros Frantzis <alexandros.frantzis at collabora.com>
>> ---
>> Changes in v2:
>> - Fill in only the used part of the ubo_idx array in vrend_shader_info
>>
>> src/vrend_renderer.c | 22 +++++++++++++++++++---
>> src/vrend_shader.c | 1 +
>> src/vrend_shader.h | 1 +
>> 3 files changed, 21 insertions(+), 3 deletions(-)
>>
>> diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c
>> index 8e55f63..ac9723c 100644
>> --- a/src/vrend_renderer.c
>> +++ b/src/vrend_renderer.c
>> @@ -1046,7 +1046,8 @@ static struct vrend_linked_shader_program *add_shader_program(struct vrend_conte
>>
>> sprog->ubo_locs[id] = calloc(sprog->ss[id]->sel->sinfo.num_ubos, sizeof(uint32_t));
>> for (i = 0; i < sprog->ss[id]->sel->sinfo.num_ubos; i++) {
>> - snprintf(name, 32, "%subo%d", prefix, i + 1);
>> + int ubo_idx = sprog->ss[id]->sel->sinfo.ubo_idx[i];
>> + snprintf(name, 32, "%subo%d", prefix, ubo_idx);
>> sprog->ubo_locs[id][i] = glGetUniformBlockIndex(prog_id, name);
>> }
>> } else
>> @@ -2858,25 +2859,40 @@ static void vrend_draw_bind_ubo(struct vrend_context *ctx)
>> 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 = 0;
>> + 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])
>> continue;
>>
>> if (!ctx->sub->prog->ubo_locs[shader_type])
>> continue;
>>
>> + 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 */
>> 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;
>> +
>> + /* 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);
>> - shader_ubo_idx++;
>> ubo_id++;
>> }
>> }
>> diff --git a/src/vrend_shader.c b/src/vrend_shader.c
>> index bab603e..ba2c9c0 100644
>> --- a/src/vrend_shader.c
>> +++ b/src/vrend_shader.c
>> @@ -2830,6 +2830,7 @@ char *vrend_convert_shader(struct vrend_shader_cfg *cfg,
>> sinfo->samplers_used_mask = ctx.samplers_used;
>> sinfo->num_consts = ctx.num_consts;
>> sinfo->num_ubos = ctx.num_ubo;
>> + memcpy(sinfo->ubo_idx, ctx.ubo_idx, ctx.num_ubo * sizeof(*ctx.ubo_idx));
>> sinfo->num_inputs = ctx.num_inputs;
>> sinfo->num_interps = ctx.num_interps;
>> sinfo->num_outputs = ctx.num_outputs;
>> diff --git a/src/vrend_shader.h b/src/vrend_shader.h
>> index e54a85c..681bfe2 100644
>> --- a/src/vrend_shader.h
>> +++ b/src/vrend_shader.h
>> @@ -41,6 +41,7 @@ struct vrend_shader_info {
>> int num_interps;
>> int num_outputs;
>> int num_ubos;
>> + int ubo_idx[32];
>> int num_ucp;
>> int glsl_ver;
>> bool has_pervertex_out;
>> --
>> 2.17.0
>>
>> _______________________________________________
>> virglrenderer-devel mailing list
>> virglrenderer-devel at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/virglrenderer-devel
> _______________________________________________
> virglrenderer-devel mailing list
> virglrenderer-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/virglrenderer-devel
More information about the virglrenderer-devel
mailing list