tessellation: add position/pointsize semantic support (v2)

v2: fix tess eval pointsize output

Tested-by: Elie Tournier <elie.tournier@collabora.com>
Reviewed-by: Elie Tournier <elie.tournier@collabora.com>
Tested-by: Jakob Bornecrantz <jakob@collabora.com>
macos/master
Dave Airlie 7 years ago
parent 4ce377e763
commit cc911fef17
  1. 29
      src/vrend_shader.c

@ -616,7 +616,9 @@ iter_declaration(struct tgsi_iterate_context *iter,
} }
/* fallthrough */ /* fallthrough */
case TGSI_SEMANTIC_PSIZE: case TGSI_SEMANTIC_PSIZE:
if (iter->processor.Processor == TGSI_PROCESSOR_GEOMETRY) { if (iter->processor.Processor == TGSI_PROCESSOR_GEOMETRY ||
iter->processor.Processor == TGSI_PROCESSOR_TESS_CTRL ||
iter->processor.Processor == TGSI_PROCESSOR_TESS_EVAL) {
name_prefix = "gl_PointSize"; name_prefix = "gl_PointSize";
ctx->inputs[i].glsl_predefined_no_emit = true; ctx->inputs[i].glsl_predefined_no_emit = true;
ctx->inputs[i].glsl_no_index = true; ctx->inputs[i].glsl_no_index = true;
@ -642,7 +644,9 @@ iter_declaration(struct tgsi_iterate_context *iter,
} }
/* fallthrough */ /* fallthrough */
case TGSI_SEMANTIC_POSITION: case TGSI_SEMANTIC_POSITION:
if (iter->processor.Processor == TGSI_PROCESSOR_GEOMETRY) { if (iter->processor.Processor == TGSI_PROCESSOR_GEOMETRY ||
iter->processor.Processor == TGSI_PROCESSOR_TESS_CTRL ||
iter->processor.Processor == TGSI_PROCESSOR_TESS_EVAL) {
name_prefix = "gl_Position"; name_prefix = "gl_Position";
ctx->inputs[i].glsl_predefined_no_emit = true; ctx->inputs[i].glsl_predefined_no_emit = true;
ctx->inputs[i].glsl_no_index = true; ctx->inputs[i].glsl_no_index = true;
@ -726,12 +730,16 @@ iter_declaration(struct tgsi_iterate_context *iter,
switch (ctx->outputs[i].name) { switch (ctx->outputs[i].name) {
case TGSI_SEMANTIC_POSITION: case TGSI_SEMANTIC_POSITION:
if (iter->processor.Processor == TGSI_PROCESSOR_VERTEX || if (iter->processor.Processor == TGSI_PROCESSOR_VERTEX ||
iter->processor.Processor == TGSI_PROCESSOR_GEOMETRY) { iter->processor.Processor == TGSI_PROCESSOR_GEOMETRY ||
iter->processor.Processor == TGSI_PROCESSOR_TESS_CTRL ||
iter->processor.Processor == TGSI_PROCESSOR_TESS_EVAL) {
if (ctx->outputs[i].first > 0) if (ctx->outputs[i].first > 0)
fprintf(stderr,"Illegal position input\n"); fprintf(stderr,"Illegal position input\n");
name_prefix = "gl_Position"; name_prefix = "gl_Position";
ctx->outputs[i].glsl_predefined_no_emit = true; ctx->outputs[i].glsl_predefined_no_emit = true;
ctx->outputs[i].glsl_no_index = true; ctx->outputs[i].glsl_no_index = true;
if (iter->processor.Processor == TGSI_PROCESSOR_TESS_CTRL)
ctx->outputs[i].glsl_gl_block = true;
} else if (iter->processor.Processor == TGSI_PROCESSOR_FRAGMENT) { } else if (iter->processor.Processor == TGSI_PROCESSOR_FRAGMENT) {
name_prefix = "gl_FragDepth"; name_prefix = "gl_FragDepth";
ctx->outputs[i].glsl_predefined_no_emit = true; ctx->outputs[i].glsl_predefined_no_emit = true;
@ -805,17 +813,16 @@ iter_declaration(struct tgsi_iterate_context *iter,
} }
/* fallthrough */ /* fallthrough */
case TGSI_SEMANTIC_PSIZE: case TGSI_SEMANTIC_PSIZE:
if (iter->processor.Processor == TGSI_PROCESSOR_VERTEX) { if (iter->processor.Processor == TGSI_PROCESSOR_VERTEX ||
ctx->outputs[i].glsl_predefined_no_emit = true; iter->processor.Processor == TGSI_PROCESSOR_GEOMETRY ||
ctx->outputs[i].glsl_no_index = true; iter->processor.Processor == TGSI_PROCESSOR_TESS_CTRL ||
ctx->outputs[i].override_no_wm = true; iter->processor.Processor == TGSI_PROCESSOR_TESS_EVAL) {
name_prefix = "gl_PointSize";
break;
} else if (iter->processor.Processor == TGSI_PROCESSOR_GEOMETRY) {
ctx->outputs[i].glsl_predefined_no_emit = true; ctx->outputs[i].glsl_predefined_no_emit = true;
ctx->outputs[i].glsl_no_index = true; ctx->outputs[i].glsl_no_index = true;
ctx->outputs[i].override_no_wm = true; ctx->outputs[i].override_no_wm = true;
name_prefix = "gl_PointSize"; name_prefix = "gl_PointSize";
if (iter->processor.Processor == TGSI_PROCESSOR_TESS_CTRL)
ctx->outputs[i].glsl_gl_block = true;
break; break;
} }
/* fallthrough */ /* fallthrough */
@ -3287,7 +3294,7 @@ static char *emit_ios(struct dump_ctx *ctx, char *glsl_hdr)
snprintf(buf, 255, "uniform vec4 clipp[8];\n"); snprintf(buf, 255, "uniform vec4 clipp[8];\n");
STRCAT_WITH_RET(glsl_hdr, buf); STRCAT_WITH_RET(glsl_hdr, buf);
} }
if (ctx->key->gs_present) { if (ctx->key->gs_present || ctx->key->tes_present) {
ctx->vs_has_pervertex = true; ctx->vs_has_pervertex = true;
snprintf(buf, 255, "out gl_PerVertex {\n vec4 gl_Position;\n float gl_PointSize;\n%s%s};\n", clip_buf, cull_buf); snprintf(buf, 255, "out gl_PerVertex {\n vec4 gl_Position;\n float gl_PointSize;\n%s%s};\n", clip_buf, cull_buf);
STRCAT_WITH_RET(glsl_hdr, buf); STRCAT_WITH_RET(glsl_hdr, buf);

Loading…
Cancel
Save