shader: generate bindings with layout qualifiers

OpenGL ES 3.1 doesn't support using glUniform1i() for binding
images, so let's use layout qualifiers instead. This should in
theory be slightly more performant as well, as we do less API
calls.

A future improvement would be to also do this on GL 4.2 and later
as well.

Signed-off-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
Signed-off-by: Dave Airlie <airlied@redhat.com>
macos/master
Erik Faye-Lund 6 years ago committed by Dave Airlie
parent 921602de80
commit f97bec1799
  1. 3
      src/vrend_renderer.c
  2. 95
      src/vrend_shader.c

@ -3671,7 +3671,8 @@ static void vrend_draw_bind_images_shader(struct vrend_context *ctx, int shader_
iview->texture->base.depth0 > 1) && (iview->u.tex.first_layer == iview->u.tex.last_layer));
}
glUniform1i(ctx->sub->prog->img_locs[shader_type][i], i);
if (!vrend_state.use_gles)
glUniform1i(ctx->sub->prog->img_locs[shader_type][i], i);
switch (iview->access) {
case PIPE_IMAGE_ACCESS_READ:

@ -4150,121 +4150,121 @@ const char *get_internalformat_string(int virgl_format, enum tgsi_return_type *s
switch (virgl_format) {
case PIPE_FORMAT_R11G11B10_FLOAT:
*stype = TGSI_RETURN_TYPE_FLOAT;
return "layout(r11f_g11f_b10f) ";
return "r11f_g11f_b10f";
case PIPE_FORMAT_R10G10B10A2_UNORM:
*stype = TGSI_RETURN_TYPE_UNORM;
return "layout(rgb10_a2) ";
return "rgb10_a2";
case PIPE_FORMAT_R10G10B10A2_UINT:
*stype = TGSI_RETURN_TYPE_UINT;
return "layout(rgb10_a2ui) ";
return "rgb10_a2ui";
case PIPE_FORMAT_R8_UNORM:
*stype = TGSI_RETURN_TYPE_UNORM;
return "layout(r8) ";
return "r8";
case PIPE_FORMAT_R8_SNORM:
*stype = TGSI_RETURN_TYPE_SNORM;
return "layout(r8_snorm) ";
return "r8_snorm";
case PIPE_FORMAT_R8_UINT:
*stype = TGSI_RETURN_TYPE_UINT;
return "layout(r8ui) ";
return "r8ui";
case PIPE_FORMAT_R8_SINT:
*stype = TGSI_RETURN_TYPE_SINT;
return "layout(r8i) ";
return "r8i";
case PIPE_FORMAT_R8G8_UNORM:
*stype = TGSI_RETURN_TYPE_UNORM;
return "layout(rg8) ";
return "rg8";
case PIPE_FORMAT_R8G8_SNORM:
*stype = TGSI_RETURN_TYPE_SNORM;
return "layout(rg8_snorm) ";
return "rg8_snorm";
case PIPE_FORMAT_R8G8_UINT:
*stype = TGSI_RETURN_TYPE_UINT;
return "layout(rg8ui) ";
return "rg8ui";
case PIPE_FORMAT_R8G8_SINT:
*stype = TGSI_RETURN_TYPE_SINT;
return "layout(rg8i) ";
return "rg8i";
case PIPE_FORMAT_R8G8B8A8_UNORM:
*stype = TGSI_RETURN_TYPE_UNORM;
return "layout(rgba8) ";
return "rgba8";
case PIPE_FORMAT_R8G8B8A8_SNORM:
*stype = TGSI_RETURN_TYPE_SNORM;
return "layout(rgba8_snorm) ";
return "rgba8_snorm";
case PIPE_FORMAT_R8G8B8A8_UINT:
*stype = TGSI_RETURN_TYPE_UINT;
return "layout(rgba8ui) ";
return "rgba8ui";
case PIPE_FORMAT_R8G8B8A8_SINT:
*stype = TGSI_RETURN_TYPE_SINT;
return "layout(rgba8i) ";
return "rgba8i";
case PIPE_FORMAT_R16_UNORM:
*stype = TGSI_RETURN_TYPE_UNORM;
return "layout(r16) ";
return "r16";
case PIPE_FORMAT_R16_SNORM:
*stype = TGSI_RETURN_TYPE_SNORM;
return "layout(r16_snorm) ";
return "r16_snorm";
case PIPE_FORMAT_R16_UINT:
*stype = TGSI_RETURN_TYPE_UINT;
return "layout(r16ui) ";
return "r16ui";
case PIPE_FORMAT_R16_SINT:
*stype = TGSI_RETURN_TYPE_SINT;
return "layout(r16i) ";
return "r16i";
case PIPE_FORMAT_R16_FLOAT:
*stype = TGSI_RETURN_TYPE_FLOAT;
return "layout(r16f) ";
return "r16f";
case PIPE_FORMAT_R16G16_UNORM:
*stype = TGSI_RETURN_TYPE_UNORM;
return "layout(rg16) ";
return "rg16";
case PIPE_FORMAT_R16G16_SNORM:
*stype = TGSI_RETURN_TYPE_SNORM;
return "layout(rg16_snorm) ";
return "rg16_snorm";
case PIPE_FORMAT_R16G16_UINT:
*stype = TGSI_RETURN_TYPE_UINT;
return "layout(rg16ui) ";
return "rg16ui";
case PIPE_FORMAT_R16G16_SINT:
*stype = TGSI_RETURN_TYPE_SINT;
return "layout(rg16i) ";
return "rg16i";
case PIPE_FORMAT_R16G16_FLOAT:
*stype = TGSI_RETURN_TYPE_FLOAT;
return "layout(rg16f) ";
return "rg16f";
case PIPE_FORMAT_R16G16B16A16_UNORM:
*stype = TGSI_RETURN_TYPE_UNORM;
return "layout(rgba16) ";
return "rgba16";
case PIPE_FORMAT_R16G16B16A16_SNORM:
*stype = TGSI_RETURN_TYPE_SNORM;
return "layout(rgba16_snorm) ";
return "rgba16_snorm";
case PIPE_FORMAT_R16G16B16A16_FLOAT:
*stype = TGSI_RETURN_TYPE_FLOAT;
return "layout(rgba16f) ";
return "rgba16f";
case PIPE_FORMAT_R32_FLOAT:
*stype = TGSI_RETURN_TYPE_FLOAT;
return "layout(r32f) ";
return "r32f";
case PIPE_FORMAT_R32_UINT:
*stype = TGSI_RETURN_TYPE_UINT;
return "layout(r32ui) ";
return "r32ui";
case PIPE_FORMAT_R32_SINT:
*stype = TGSI_RETURN_TYPE_SINT;
return "layout(r32i) ";
return "r32i";
case PIPE_FORMAT_R32G32_FLOAT:
*stype = TGSI_RETURN_TYPE_FLOAT;
return "layout(rg32f) ";
return "rg32f";
case PIPE_FORMAT_R32G32_UINT:
*stype = TGSI_RETURN_TYPE_UINT;
return "layout(rg32ui) ";
return "rg32ui";
case PIPE_FORMAT_R32G32_SINT:
*stype = TGSI_RETURN_TYPE_SINT;
return "layout(rg32i) ";
return "rg32i";
case PIPE_FORMAT_R32G32B32A32_FLOAT:
*stype = TGSI_RETURN_TYPE_FLOAT;
return "layout(rgba32f) ";
return "rgba32f";
case PIPE_FORMAT_R32G32B32A32_UINT:
*stype = TGSI_RETURN_TYPE_UINT;
return "layout(rgba32ui) ";
return "rgba32ui";
case PIPE_FORMAT_R16G16B16A16_UINT:
*stype = TGSI_RETURN_TYPE_UINT;
return "layout(rgba16ui) ";
return "rgba16ui";
case PIPE_FORMAT_R16G16B16A16_SINT:
*stype = TGSI_RETURN_TYPE_SINT;
return "layout(rgba16i) ";
return "rgba16i";
case PIPE_FORMAT_R32G32B32A32_SINT:
*stype = TGSI_RETURN_TYPE_SINT;
return "layout(rgba32i) ";
return "rgba32i";
case PIPE_FORMAT_NONE:
*stype = TGSI_RETURN_TYPE_UNORM;
return "";
@ -4290,12 +4290,21 @@ static void *emit_image_decl(const struct dump_ctx *ctx, char *glsl_hdr,
sname = tgsi_proc_to_prefix(ctx->prog_type);
stc = vrend_shader_samplertypeconv(image->decl.Resource, &is_shad);
if (ctx->cfg->use_gles) { /* TODO: enable on OpenGL 4.2 and up also */
snprintf(buf, 255, "layout(binding=%d%s%s) ",
i, formatstr[0] != '\0' ? ", " : "", formatstr);
STRCAT_WITH_RET(glsl_hdr, buf);
} else if (formatstr[0] != '\0') {
snprintf(buf, 255, "layout(%s) ", formatstr);
STRCAT_WITH_RET(glsl_hdr, buf);
}
if (range)
snprintf(buf, 255, "%s%s%suniform %cimage%s %simg%d[%d];\n",
formatstr, writeonly, volatile_str, ptc, stc, sname, i, range);
snprintf(buf, 255, "%s%suniform %cimage%s %simg%d[%d];\n",
writeonly, volatile_str, ptc, stc, sname, i, range);
else
snprintf(buf, 255, "%s%s%suniform %cimage%s %simg%d;\n",
formatstr, writeonly, volatile_str, ptc, stc, sname, i);
snprintf(buf, 255, "%s%suniform %cimage%s %simg%d;\n",
writeonly, volatile_str, ptc, stc, sname, i);
STRCAT_WITH_RET(glsl_hdr, buf);
return glsl_hdr;

Loading…
Cancel
Save