[virglrenderer-devel] [PATCH 09/21] tessellation: add some baseline tess support.

Dave Airlie airlied at gmail.com
Wed Jun 13 00:56:43 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