[virglrenderer-devel] [PATCH 5/5] emit precise keyword
Erik Faye-Lund
erik.faye-lund at collabora.com
Thu Jul 12 07:55:39 UTC 2018
TGSI has a different model for precise than GLSL, so we have to mark
all outputs that has gotten an precise operation output to it as
precise.
This only implements part of the 'precise' keyword (still lacking
support on indevidual operations), but it's enough to pass some dEQP
tests, in particular:
- dEQP-GLES31.functional.tessellation.common_edge.triangles_equal_spacing_precise
- dEQP-GLES31.functional.tessellation.common_edge.triangles_fractional_odd_spacing_precise
- dEQP-GLES31.functional.tessellation.common_edge.triangles_fractional_even_spacing_precise
- dEQP-GLES31.functional.tessellation.common_edge.quads_equal_spacing_precise
- dEQP-GLES31.functional.tessellation.common_edge.quads_fractional_odd_spacing_precise
- dEQP-GLES31.functional.tessellation.common_edge.quads_fractional_even_spacing_precise
Signed-off-by: Erik Faye-Lund <erik.faye-lund at collabora.com>
---
src/vrend_shader.c | 25 +++++++++++++++++++++----
1 file changed, 21 insertions(+), 4 deletions(-)
diff --git a/src/vrend_shader.c b/src/vrend_shader.c
index 15d7735..41b74e4 100644
--- a/src/vrend_shader.c
+++ b/src/vrend_shader.c
@@ -66,6 +66,7 @@ struct vrend_shader_io {
int first;
unsigned location;
bool invariant;
+ bool precise;
bool glsl_predefined_no_emit;
bool glsl_no_index;
bool glsl_gl_block;
@@ -788,6 +789,7 @@ iter_declaration(struct tgsi_iterate_context *iter,
ctx->outputs[i].sid = decl->Semantic.Index;
ctx->outputs[i].interpolate = decl->Interp.Interpolate;
ctx->outputs[i].invariant = decl->Declaration.Invariant;
+ ctx->outputs[i].precise = false;
ctx->outputs[i].first = decl->Range.First;
ctx->outputs[i].glsl_predefined_no_emit = false;
ctx->outputs[i].glsl_no_index = false;
@@ -2199,6 +2201,12 @@ get_destination_info(struct dump_ctx *ctx,
if (dst_reg->Register.File == TGSI_FILE_OUTPUT) {
for (uint32_t j = 0; j < ctx->num_outputs; j++) {
if (ctx->outputs[j].first == dst_reg->Register.Index) {
+
+ if (inst->Instruction.Precise) {
+ ctx->outputs[j].precise = true;
+ ctx->shader_req_bits |= SHADER_REQ_GPU_SHADER5;
+ }
+
if (ctx->glsl_ver_required >= 140 && ctx->outputs[j].name == TGSI_SEMANTIC_CLIPVERTEX) {
snprintf(dsts[i], 255, "clipv_tmp");
} else if (ctx->outputs[j].name == TGSI_SEMANTIC_CLIPDIST) {
@@ -3645,12 +3653,21 @@ static char *emit_ios(struct dump_ctx *ctx, char *glsl_hdr)
else
snprintf(buf, 255, "%sout vec4 %s[];\n", prefix, ctx->outputs[i].glsl_name);
} else if (ctx->prog_type == TGSI_PROCESSOR_GEOMETRY && ctx->outputs[i].stream)
- snprintf(buf, 255, "layout (stream = %d) %s%sout vec4 %s;\n", ctx->outputs[i].stream, prefix, ctx->outputs[i].invariant ? "invariant " : "", ctx->outputs[i].glsl_name);
+ snprintf(buf, 255, "layout (stream = %d) %s%s%sout vec4 %s;\n", ctx->outputs[i].stream, prefix,
+ ctx->outputs[i].invariant ? "invariant " : "",
+ ctx->outputs[i].precise ? "precise " : "",
+ ctx->outputs[i].glsl_name);
else
- snprintf(buf, 255, "%s%sout vec4 %s;\n", prefix, ctx->outputs[i].invariant ? "invariant " : "", ctx->outputs[i].glsl_name);
+ snprintf(buf, 255, "%s%s%sout vec4 %s;\n", prefix,
+ ctx->outputs[i].invariant ? "invariant " : "",
+ ctx->outputs[i].precise ? "precise " : "",
+ ctx->outputs[i].glsl_name);
STRCAT_WITH_RET(glsl_hdr, buf);
- } else if (ctx->outputs[i].invariant) {
- snprintf(buf, 255, "invariant %s;\n", ctx->outputs[i].glsl_name);
+ } else if (ctx->outputs[i].invariant || ctx->outputs[i].precise) {
+ snprintf(buf, 255, "%s%s %s;\n",
+ ctx->outputs[i].invariant ? "invariant " : "",
+ ctx->outputs[i].precise ? "precise " : "",
+ ctx->outputs[i].glsl_name);
STRCAT_WITH_RET(glsl_hdr, buf);
}
}
--
2.18.0.rc2
More information about the virglrenderer-devel
mailing list