summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mesa/state_tracker/st_cb_drawtex.c69
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);
}