diff --git a/src/vrend_shader.c b/src/vrend_shader.c index 639a122..4502d05 100644 --- a/src/vrend_shader.c +++ b/src/vrend_shader.c @@ -71,6 +71,7 @@ #define SHADER_REQ_ARRAYS_OF_ARRAYS (1 << 26) #define SHADER_REQ_SHADER_INTEGER_FUNC (1 << 27) #define SHADER_REQ_SHADER_ATOMIC_FLOAT (1 << 28) +#define SHADER_REQ_NV_IMAGE_FORMATS (1 << 29) struct vrend_shader_io { unsigned name; @@ -635,6 +636,27 @@ static bool add_images(struct dump_ctx *ctx, int first, int last, { int i; + const struct util_format_description *descr = util_format_description(img_decl->Format); + if (descr->nr_channels == 2 && + descr->swizzle[0] == UTIL_FORMAT_SWIZZLE_X && + descr->swizzle[1] == UTIL_FORMAT_SWIZZLE_Y && + descr->swizzle[2] == UTIL_FORMAT_SWIZZLE_0 && + descr->swizzle[3] == UTIL_FORMAT_SWIZZLE_1) { + ctx->shader_req_bits |= SHADER_REQ_NV_IMAGE_FORMATS; + } else if (img_decl->Format == PIPE_FORMAT_R11G11B10_FLOAT || + img_decl->Format == PIPE_FORMAT_R10G10B10A2_UINT || + img_decl->Format == PIPE_FORMAT_R10G10B10A2_UNORM || + img_decl->Format == PIPE_FORMAT_R16G16B16A16_UNORM|| + img_decl->Format == PIPE_FORMAT_R16G16B16A16_SNORM) + ctx->shader_req_bits |= SHADER_REQ_NV_IMAGE_FORMATS; + else if (descr->nr_channels == 1 && + descr->swizzle[0] == UTIL_FORMAT_SWIZZLE_X && + descr->swizzle[1] == UTIL_FORMAT_SWIZZLE_0 && + descr->swizzle[2] == UTIL_FORMAT_SWIZZLE_0 && + descr->swizzle[3] == UTIL_FORMAT_SWIZZLE_1 && + (descr->channel[0].size == 8 || descr->channel[0].size ==16)) + ctx->shader_req_bits |= SHADER_REQ_NV_IMAGE_FORMATS; + for (i = first; i <= last; i++) { ctx->images[i].decl = *img_decl; ctx->images[i].vflag = false; @@ -2721,7 +2743,10 @@ translate_load(struct dump_ctx *ctx, * For the images that allow RW this is of no consequence, and for the others a write * access will fail instead of the read access, but this doesn't constitue a regression * because we couldn't do both, read and write, anyway. */ - if (ctx->cfg->use_gles && ctx->images[sinfo->sreg_index].decl.Writable) + if (ctx->cfg->use_gles && ctx->images[sinfo->sreg_index].decl.Writable && + (ctx->images[sinfo->sreg_index].decl.Format != PIPE_FORMAT_R32_FLOAT) && + (ctx->images[sinfo->sreg_index].decl.Format != PIPE_FORMAT_R32_SINT) && + (ctx->images[sinfo->sreg_index].decl.Format != PIPE_FORMAT_R32_UINT)) ctx->images[sinfo->sreg_index].decl.Writable = 0; emit_buff(ctx, "%s = %s(imageLoad(%s, %s(%s(%s))%s)%s);\n", dsts[0], get_string(dtypeprefix), srcs[0], @@ -4824,6 +4849,9 @@ static void emit_header(struct dump_ctx *ctx) emit_ext(ctx, "OES_geometry_point_size", "enable"); } + if (ctx->shader_req_bits & SHADER_REQ_NV_IMAGE_FORMATS) + emit_ext(ctx, "NV_image_formats", "require"); + if ((ctx->prog_type == TGSI_PROCESSOR_TESS_CTRL || ctx->prog_type == TGSI_PROCESSOR_TESS_EVAL)) { if (ctx->cfg->glsl_version < 320)