diff options
-rw-r--r-- | src/mesa/state_tracker/st_cb_drawtex.c | 69 |
1 files changed, 62 insertions, 7 deletions
diff --git a/src/mesa/state_tracker/st_cb_drawtex.c b/src/mesa/state_tracker/st_cb_drawtex.c index b6bf71d4cd1..3c583b3927f 100644 --- a/src/mesa/state_tracker/st_cb_drawtex.c +++ b/src/mesa/state_tracker/st_cb_drawtex.c @@ -24,6 +24,7 @@ #include "st_atom.h" #include "st_cb_bitmap.h" #include "st_cb_drawtex.h" +#include "st_nir.h" #include "pipe/p_context.h" #include "pipe/p_defines.h" @@ -55,13 +56,46 @@ struct cached_shader static struct cached_shader CachedShaders[MAX_SHADERS]; static GLuint NumCachedShaders = 0; +static gl_vert_attrib +semantic_to_vert_attrib(unsigned semantic) +{ + switch (semantic) { + case TGSI_SEMANTIC_POSITION: + return VERT_ATTRIB_POS; + case TGSI_SEMANTIC_COLOR: + return VERT_ATTRIB_COLOR0; + case TGSI_SEMANTIC_GENERIC: + case TGSI_SEMANTIC_TEXCOORD: + return VERT_ATTRIB_GENERIC0; + default: + unreachable("unhandled semantic"); + } +} + +static gl_varying_slot +semantic_to_varying_slot(unsigned semantic) +{ + switch (semantic) { + case TGSI_SEMANTIC_POSITION: + return VARYING_SLOT_POS; + case TGSI_SEMANTIC_COLOR: + return VARYING_SLOT_COL0; + case TGSI_SEMANTIC_GENERIC: + case TGSI_SEMANTIC_TEXCOORD: + return VARYING_SLOT_TEX0; + default: + unreachable("unhandled semantic"); + } +} static void * -lookup_shader(struct pipe_context *pipe, +lookup_shader(struct st_context *st, uint num_attribs, const uint *semantic_names, const uint *semantic_indexes) { + struct pipe_context *pipe = st->pipe; + struct pipe_screen *screen = pipe->screen; GLuint i, j; /* look for existing shader with same attributes */ @@ -91,11 +125,32 @@ lookup_shader(struct pipe_context *pipe, CachedShaders[i].semantic_indexes[j] = semantic_indexes[j]; } - CachedShaders[i].handle = - util_make_vertex_passthrough_shader(pipe, - num_attribs, - semantic_names, - semantic_indexes, FALSE); + enum pipe_shader_ir preferred_ir = + screen->get_shader_param(screen, MESA_SHADER_VERTEX, + PIPE_SHADER_CAP_PREFERRED_IR); + + if (preferred_ir == PIPE_SHADER_IR_NIR) { + unsigned inputs[2 + MAX_TEXTURE_UNITS]; + unsigned outputs[2 + MAX_TEXTURE_UNITS]; + + for (int j = 0; j < num_attribs; j++) { + inputs[j] = semantic_to_vert_attrib(semantic_names[j]); + outputs[j] = semantic_to_varying_slot(semantic_names[j]); + } + + CachedShaders[i].handle = + st_nir_make_passthrough_shader(st, "st/drawtex VS", + MESA_SHADER_VERTEX, + num_attribs, inputs, + outputs, NULL, 0); + } else { + CachedShaders[i].handle = + util_make_vertex_passthrough_shader(pipe, + num_attribs, + semantic_names, + semantic_indexes, FALSE); + } + NumCachedShaders++; return CachedShaders[i].handle; @@ -243,7 +298,7 @@ st_DrawTex(struct gl_context *ctx, GLfloat x, GLfloat y, GLfloat z, CSO_BIT_AUX_VERTEX_BUFFER_SLOT)); { - void *vs = lookup_shader(pipe, numAttribs, + void *vs = lookup_shader(st, numAttribs, semantic_names, semantic_indexes); cso_set_vertex_shader_handle(cso, vs); } |