[virglrenderer-devel] [PATCH 09/21] tessellation: add some baseline tess support.
Dave Airlie
airlied at gmail.com
Mon Jun 11 05:11:00 UTC 2018
From: Dave Airlie <airlied at redhat.com>
This adds the shader key bits, along with a bunch of the
string handling for tess shaders
---
src/vrend_renderer.c | 4 ++++
src/vrend_shader.c | 47 ++++++++++++++++++++++++++++++++++++++++++-----
src/vrend_shader.h | 2 ++
3 files changed, 48 insertions(+), 5 deletions(-)
diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c
index ff3d64d..b756c10 100644
--- a/src/vrend_renderer.c
+++ b/src/vrend_renderer.c
@@ -467,6 +467,8 @@ static inline const char *pipe_shader_to_prefix(int shader_type)
case PIPE_SHADER_VERTEX: return "vs";
case PIPE_SHADER_FRAGMENT: return "fs";
case PIPE_SHADER_GEOMETRY: return "gs";
+ case PIPE_SHADER_TESS_CTRL: return "tc";
+ case PIPE_SHADER_TESS_EVAL: return "te";
default:
return NULL;
};
@@ -2182,6 +2184,8 @@ static inline int conv_shader_type(int type)
case PIPE_SHADER_VERTEX: return GL_VERTEX_SHADER;
case PIPE_SHADER_FRAGMENT: return GL_FRAGMENT_SHADER;
case PIPE_SHADER_GEOMETRY: return GL_GEOMETRY_SHADER;
+ case PIPE_SHADER_TESS_CTRL: return GL_TESS_CONTROL_SHADER;
+ case PIPE_SHADER_TESS_EVAL: return GL_TESS_EVALUATION_SHADER;
default:
return 0;
};
diff --git a/src/vrend_shader.c b/src/vrend_shader.c
index 45920b9..83d1410 100644
--- a/src/vrend_shader.c
+++ b/src/vrend_shader.c
@@ -267,6 +267,8 @@ static inline const char *tgsi_proc_to_prefix(int shader_type)
case TGSI_PROCESSOR_VERTEX: return "vs";
case TGSI_PROCESSOR_FRAGMENT: return "fs";
case TGSI_PROCESSOR_GEOMETRY: return "gs";
+ case TGSI_PROCESSOR_TESS_CTRL: return "tc";
+ case TGSI_PROCESSOR_TESS_EVAL: return "te";
default:
return NULL;
};
@@ -282,6 +284,7 @@ static inline const char *prim_to_name(int prim)
case PIPE_PRIM_TRIANGLES: return "triangles";
case PIPE_PRIM_TRIANGLE_STRIP: return "triangle_strip";
case PIPE_PRIM_TRIANGLES_ADJACENCY: return "triangles_adjacency";
+ case PIPE_PRIM_QUADS: return "quads";
default: return "UNKNOWN";
};
}
@@ -318,12 +321,26 @@ static const char *get_stage_input_name_prefix(struct dump_ctx *ctx, int process
case TGSI_PROCESSOR_FRAGMENT:
if (ctx->key->gs_present)
name_prefix = "gso";
+ else if (ctx->key->tes_present)
+ name_prefix = "teo";
else
name_prefix = "vso";
break;
case TGSI_PROCESSOR_GEOMETRY:
- name_prefix = "vso";
+ if (ctx->key->tes_present)
+ name_prefix = "teo";
+ else
+ name_prefix = "vso";
+ break;
+ case TGSI_PROCESSOR_TESS_EVAL:
+ if (ctx->key->tcs_present)
+ name_prefix = "tco";
+ else
+ name_prefix = "vso";
break;
+ case TGSI_PROCESSOR_TESS_CTRL:
+ name_prefix = "vso";
+ break;
case TGSI_PROCESSOR_VERTEX:
default:
name_prefix = "in";
@@ -345,6 +362,12 @@ static const char *get_stage_output_name_prefix(int processor)
case TGSI_PROCESSOR_VERTEX:
name_prefix = "vso";
break;
+ case TGSI_PROCESSOR_TESS_CTRL:
+ name_prefix = "tco";
+ break;
+ case TGSI_PROCESSOR_TESS_EVAL:
+ name_prefix = "teo";
+ break;
default:
name_prefix = "out";
break;
@@ -1293,7 +1316,7 @@ static int emit_buf(struct dump_ctx *ctx, const char *buf)
static int handle_vertex_proc_exit(struct dump_ctx *ctx)
{
- if (ctx->so && !ctx->key->gs_present) {
+ if (ctx->so && !ctx->key->gs_present && !ctx->key->tes_present) {
if (emit_so_movs(ctx))
return FALSE;
}
@@ -1301,7 +1324,7 @@ static int handle_vertex_proc_exit(struct dump_ctx *ctx)
if (emit_clip_dist_movs(ctx))
return FALSE;
- if (!ctx->key->gs_present) {
+ if (!ctx->key->gs_present && !ctx->key->tes_present) {
if (emit_prescale(ctx))
return FALSE;
}
@@ -2746,6 +2769,12 @@ iter_instruction(struct tgsi_iterate_context *iter,
if (iter->processor.Processor == TGSI_PROCESSOR_VERTEX) {
if (handle_vertex_proc_exit(ctx) == FALSE)
return FALSE;
+ } else if (iter->processor.Processor == TGSI_PROCESSOR_TESS_CTRL) {
+ if (!ctx->key->gs_present) {
+ ret = emit_prescale(ctx);
+ if (ret)
+ return FALSE;
+ }
} else if (iter->processor.Processor == TGSI_PROCESSOR_FRAGMENT) {
if (handle_fragment_proc_exit(ctx) == FALSE)
return FALSE;
@@ -2938,13 +2967,20 @@ static char *emit_header(struct dump_ctx *ctx, char *glsl_hdr)
STRCAT_WITH_RET(glsl_hdr, "precision highp int;\n");
} else {
char buf[128];
- if (ctx->prog_type == TGSI_PROCESSOR_GEOMETRY || ctx->glsl_ver_required == 150)
+ if (ctx->prog_type == TGSI_PROCESSOR_GEOMETRY ||
+ ctx->prog_type == TGSI_PROCESSOR_TESS_EVAL ||
+ ctx->prog_type == TGSI_PROCESSOR_TESS_CTRL ||
+ ctx->glsl_ver_required == 150)
STRCAT_WITH_RET(glsl_hdr, "#version 150\n");
else if (ctx->glsl_ver_required == 140)
STRCAT_WITH_RET(glsl_hdr, "#version 140\n");
else
STRCAT_WITH_RET(glsl_hdr, "#version 130\n");
+ if (ctx->prog_type == TGSI_PROCESSOR_TESS_CTRL ||
+ ctx->prog_type == TGSI_PROCESSOR_TESS_EVAL)
+ STRCAT_WITH_RET(glsl_hdr, "#extension GL_ARB_tessellation_shader : require\n");
+
if (ctx->prog_type == TGSI_PROCESSOR_VERTEX && ctx->cfg->use_explicit_locations)
STRCAT_WITH_RET(glsl_hdr, "#extension GL_ARB_explicit_attrib_location : require\n");
if (ctx->prog_type == TGSI_PROCESSOR_FRAGMENT && fs_emit_layout(ctx))
@@ -3159,7 +3195,8 @@ static char *emit_ios(struct dump_ctx *ctx, char *glsl_hdr)
}
if (ctx->prog_type == TGSI_PROCESSOR_VERTEX ||
- ctx->prog_type == TGSI_PROCESSOR_GEOMETRY) {
+ ctx->prog_type == TGSI_PROCESSOR_GEOMETRY ||
+ ctx->prog_type == TGSI_PROCESSOR_TESS_EVAL) {
snprintf(buf, 255, "uniform float winsys_adjust_y;\n");
STRCAT_WITH_RET(glsl_hdr, buf);
}
diff --git a/src/vrend_shader.h b/src/vrend_shader.h
index 149f389..2fe9f28 100644
--- a/src/vrend_shader.h
+++ b/src/vrend_shader.h
@@ -80,6 +80,8 @@ struct vrend_shader_key {
uint8_t alpha_test;
uint8_t clip_plane_enable;
bool gs_present;
+ bool tcs_present;
+ bool tes_present;
bool flatshade;
bool prev_stage_pervertex_out;
uint8_t prev_stage_num_clip_out;
--
2.14.3
More information about the virglrenderer-devel
mailing list