summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2018-03-27 15:14:32 +1000
committerDave Airlie <airlied@redhat.com>2018-06-05 14:52:52 +1000
commit8bec35377038cb927165ff0acb056cff0ffc5aa9 (patch)
treef259f56f35b25571d2224d8c2149ae6575abb038
parent4e300c5ce9b47c1e568bec21df4fd2e489f81c08 (diff)
moar images supportr
-rw-r--r--src/vrend_shader.c222
1 files changed, 207 insertions, 15 deletions
diff --git a/src/vrend_shader.c b/src/vrend_shader.c
index ef81616..fb97d60 100644
--- a/src/vrend_shader.c
+++ b/src/vrend_shader.c
@@ -2124,6 +2124,36 @@ create_swizzled_clipdist(struct dump_ctx *ctx,
snprintf(result, 255, "%s(vec4(%s,%s,%s,%s))", stypeprefix, clipdistvec[0], clipdistvec[1], clipdistvec[2], clipdistvec[3]);
}
+static const char *get_coord_prefix(int resource, bool *is_ms)
+{
+ switch(resource) {
+ case TGSI_TEXTURE_1D:
+ case TGSI_TEXTURE_BUFFER:
+ return "int";
+ break;
+ case TGSI_TEXTURE_2D:
+ case TGSI_TEXTURE_RECT:
+ case TGSI_TEXTURE_1D_ARRAY:
+ return "ivec2";
+ break;
+ case TGSI_TEXTURE_3D:
+ case TGSI_TEXTURE_CUBE:
+ case TGSI_TEXTURE_2D_ARRAY:
+ case TGSI_TEXTURE_CUBE_ARRAY:
+ return "ivec3";
+ break;
+ case TGSI_TEXTURE_2D_MSAA:
+ *is_ms = true;
+ return "ivec2";
+ case TGSI_TEXTURE_2D_ARRAY_MSAA:
+ *is_ms = true;
+ return "ivec3";
+ default:
+ fprintf(stderr, "NON 2D IMAGE\n");
+ return "";
+ }
+}
+
static int
translate_image_store(struct dump_ctx *ctx,
struct tgsi_full_instruction *inst,
@@ -2131,19 +2161,39 @@ translate_image_store(struct dump_ctx *ctx,
char srcs[4][255],
char dsts[3][255])
{
- char buf[512];
- const char *coord_prefix;
- switch (ctx->images[sreg_index].decl.Resource) {
- case TGSI_TEXTURE_2D:
- coord_prefix = "ivec2";
- break;
- default:
- fprintf(stderr, "NON 2D IMAGE\n");
- return -1;
- }
- snprintf(buf, 255, "imageStore(%s,%s(floatBitsToInt(%s)),%s);\n", dsts[0], coord_prefix, srcs[0], srcs[1]);
- EMIT_BUF_WITH_RET(ctx, buf);
- return 0;
+ char buf[512];
+ bool is_ms = false;
+ const char *coord_prefix = get_coord_prefix(ctx->images[sreg_index].decl.Resource, &is_ms);
+ char ms_str[32] = {};
+
+ if (is_ms) {
+ snprintf(ms_str, 32, "int(%s.w),", srcs[0]);
+ }
+
+ snprintf(buf, 255, "imageStore(%s,%s(floatBitsToInt(%s)),%s%s);\n", dsts[0], coord_prefix, srcs[0], ms_str, srcs[1]);
+ EMIT_BUF_WITH_RET(ctx, buf);
+ return 0;
+}
+
+static int
+translate_load(struct dump_ctx *ctx,
+ struct tgsi_full_instruction *inst,
+ int sreg_index,
+ char srcs[4][255],
+ char dsts[3][255])
+{
+ char buf[512];
+ bool is_ms = false;
+ const char *coord_prefix = get_coord_prefix(ctx->images[sreg_index].decl.Resource, &is_ms);
+ char ms_str[32] = {};
+
+ if (is_ms) {
+ snprintf(ms_str, 32, ", int(%s.w)", srcs[1]);
+ }
+ snprintf(buf, 255, "%s = imageLoad(%s, %s(floatBitsToInt(%s))%s);\n", dsts[0], srcs[0], coord_prefix, srcs[1], ms_str);
+ EMIT_BUF_WITH_RET(ctx, buf);
+ return 0;
+
}
struct dest_info {
@@ -3284,6 +3334,11 @@ iter_instruction(struct tgsi_iterate_context *iter,
if (ret)
return FALSE;
break;
+ case TGSI_OPCODE_LOAD:
+ ret = translate_load(ctx, inst, sreg_index, srcs, dsts);
+ if (ret)
+ return FALSE;
+ break;
default:
fprintf(stderr,"failed to convert opcode %d\n", inst->Instruction.Opcode);
break;
@@ -3458,6 +3513,136 @@ static const char *get_spacing_string(int spacing)
}
}
+const char *get_internalformat_string(int virgl_format, enum tgsi_return_type *stype)
+{
+ switch (virgl_format) {
+ case PIPE_FORMAT_R11G11B10_FLOAT:
+ *stype = TGSI_RETURN_TYPE_FLOAT;
+ return "layout(r11f_g11f_b10f) ";
+ case PIPE_FORMAT_R10G10B10A2_UNORM:
+ *stype = TGSI_RETURN_TYPE_UNORM;
+ return "layout(rgb10_a2) ";
+ case PIPE_FORMAT_R10G10B10A2_UINT:
+ *stype = TGSI_RETURN_TYPE_UINT;
+ return "layout(rgb10_a2ui) ";
+ case PIPE_FORMAT_R8_UNORM:
+ *stype = TGSI_RETURN_TYPE_UNORM;
+ return "layout(r8) ";
+ case PIPE_FORMAT_R8_SNORM:
+ *stype = TGSI_RETURN_TYPE_SNORM;
+ return "layout(r8_snorm) ";
+ case PIPE_FORMAT_R8_UINT:
+ *stype = TGSI_RETURN_TYPE_UINT;
+ return "layout(r8ui) ";
+ case PIPE_FORMAT_R8_SINT:
+ *stype = TGSI_RETURN_TYPE_SINT;
+ return "layout(r8i) ";
+ case PIPE_FORMAT_R8G8_UNORM:
+ *stype = TGSI_RETURN_TYPE_UNORM;
+ return "layout(rg8) ";
+ case PIPE_FORMAT_R8G8_SNORM:
+ *stype = TGSI_RETURN_TYPE_SNORM;
+ return "layout(rg8_snorm) ";
+ case PIPE_FORMAT_R8G8_UINT:
+ *stype = TGSI_RETURN_TYPE_UINT;
+ return "layout(rg8ui) ";
+ case PIPE_FORMAT_R8G8_SINT:
+ *stype = TGSI_RETURN_TYPE_SINT;
+ return "layout(rg8i) ";
+ case PIPE_FORMAT_R8G8B8A8_UNORM:
+ *stype = TGSI_RETURN_TYPE_UNORM;
+ return "layout(rgba8) ";
+ case PIPE_FORMAT_R8G8B8A8_SNORM:
+ *stype = TGSI_RETURN_TYPE_SNORM;
+ return "layout(rgba8_snorm) ";
+ case PIPE_FORMAT_R8G8B8A8_UINT:
+ *stype = TGSI_RETURN_TYPE_UINT;
+ return "layout(rgba8ui) ";
+ case PIPE_FORMAT_R8G8B8A8_SINT:
+ *stype = TGSI_RETURN_TYPE_SINT;
+ return "layout(rgba8i) ";
+ case PIPE_FORMAT_R16_UNORM:
+ *stype = TGSI_RETURN_TYPE_UNORM;
+ return "layout(r16) ";
+ case PIPE_FORMAT_R16_SNORM:
+ *stype = TGSI_RETURN_TYPE_SNORM;
+ return "layout(r16_snorm) ";
+ case PIPE_FORMAT_R16_UINT:
+ *stype = TGSI_RETURN_TYPE_UINT;
+ return "layout(r16ui) ";
+ case PIPE_FORMAT_R16_SINT:
+ *stype = TGSI_RETURN_TYPE_SINT;
+ return "layout(r16i) ";
+ case PIPE_FORMAT_R16_FLOAT:
+ *stype = TGSI_RETURN_TYPE_FLOAT;
+ return "layout(r16f) ";
+ case PIPE_FORMAT_R16G16_UNORM:
+ *stype = TGSI_RETURN_TYPE_UNORM;
+ return "layout(rg16) ";
+ case PIPE_FORMAT_R16G16_SNORM:
+ *stype = TGSI_RETURN_TYPE_SNORM;
+ return "layout(rg16_snorm) ";
+ case PIPE_FORMAT_R16G16_UINT:
+ *stype = TGSI_RETURN_TYPE_UINT;
+ return "layout(rg16ui) ";
+ case PIPE_FORMAT_R16G16_SINT:
+ *stype = TGSI_RETURN_TYPE_SINT;
+ return "layout(rg16i) ";
+ case PIPE_FORMAT_R16G16_FLOAT:
+ *stype = TGSI_RETURN_TYPE_FLOAT;
+ return "layout(rg16f) ";
+ case PIPE_FORMAT_R16G16B16A16_UNORM:
+ *stype = TGSI_RETURN_TYPE_UNORM;
+ return "layout(rgba16) ";
+ case PIPE_FORMAT_R16G16B16A16_SNORM:
+ *stype = TGSI_RETURN_TYPE_SNORM;
+ return "layout(rgba16_snorm) ";
+ case PIPE_FORMAT_R16G16B16A16_FLOAT:
+ *stype = TGSI_RETURN_TYPE_FLOAT;
+ return "layout(rgba16f) ";
+ case PIPE_FORMAT_R32_FLOAT:
+ *stype = TGSI_RETURN_TYPE_FLOAT;
+ return "layout(r32f) ";
+ case PIPE_FORMAT_R32_UINT:
+ *stype = TGSI_RETURN_TYPE_UINT;
+ return "layout(r32ui) ";
+ case PIPE_FORMAT_R32_SINT:
+ *stype = TGSI_RETURN_TYPE_SINT;
+ return "layout(r32i) ";
+ case PIPE_FORMAT_R32G32_FLOAT:
+ *stype = TGSI_RETURN_TYPE_FLOAT;
+ return "layout(rg32f) ";
+ case PIPE_FORMAT_R32G32_UINT:
+ *stype = TGSI_RETURN_TYPE_UINT;
+ return "layout(rg32ui) ";
+ case PIPE_FORMAT_R32G32_SINT:
+ *stype = TGSI_RETURN_TYPE_SINT;
+ return "layout(rg32i) ";
+ case PIPE_FORMAT_R32G32B32A32_FLOAT:
+ *stype = TGSI_RETURN_TYPE_FLOAT;
+ return "layout(rgba32f) ";
+ case PIPE_FORMAT_R32G32B32A32_UINT:
+ *stype = TGSI_RETURN_TYPE_UINT;
+ return "layout(rgba32ui) ";
+ case PIPE_FORMAT_R16G16B16A16_UINT:
+ *stype = TGSI_RETURN_TYPE_UINT;
+ return "layout(rgba16ui) ";
+ case PIPE_FORMAT_R16G16B16A16_SINT:
+ *stype = TGSI_RETURN_TYPE_SINT;
+ return "layout(rgba16i) ";
+ case PIPE_FORMAT_R32G32B32A32_SINT:
+ *stype = TGSI_RETURN_TYPE_SINT;
+ return "layout(rgba32i) ";
+ case PIPE_FORMAT_NONE:
+ *stype = TGSI_RETURN_TYPE_UNORM;
+ return "";
+ default:
+ *stype = TGSI_RETURN_TYPE_UNORM;
+ fprintf(stderr, "illegal format %d\n", virgl_format);
+ return "";
+ }
+}
+
static char *emit_ios(struct dump_ctx *ctx, char *glsl_hdr)
{
int i;
@@ -3898,12 +4083,19 @@ static char *emit_ios(struct dump_ctx *ctx, char *glsl_hdr)
} else {
int nimg = util_last_bit(ctx->images_used);
for (i = 0; i < nimg; i++) {
-
+ int is_shad = 0;
+ const char *stc;
+ char ptc;
if ((ctx->images_used & (1 << i)) == 0)
continue;
const char *writeonly = (ctx->images[i].decl.Format) ? "" : "writeonly ";
+ const char *formatstr;
+ enum tgsi_return_type itype;
+ formatstr = get_internalformat_string(ctx->images[i].decl.Format, &itype);
+ ptc = vrend_shader_samplerreturnconv(itype);
sname = tgsi_proc_to_prefix(ctx->prog_type);
- snprintf(buf, 255, "%suniform image2D %simg%d;\n", writeonly, sname, i);
+ stc = vrend_shader_samplertypeconv(ctx->images[i].decl.Resource, &is_shad);
+ snprintf(buf, 255, "%s%suniform %cimage%s %simg%d;\n", formatstr, writeonly, ptc, stc, sname, i);
STRCAT_WITH_RET(glsl_hdr, buf);
}
}