summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/svga/svga_state_fs.c
diff options
context:
space:
mode:
authorBrian Paul <brianp@vmware.com>2014-02-08 09:51:14 -0800
committerBrian Paul <brianp@vmware.com>2014-02-14 08:21:44 -0700
commitf84c830b144fd4d53f862fc6ad05541e5bf60a3b (patch)
treefaf33d8578c4fed38058e337898d32b9e73beb2d /src/gallium/drivers/svga/svga_state_fs.c
parent2f1fc8db108eb771414aa5440d4c439f63f4e7c1 (diff)
downloadexternal_mesa3d-f84c830b144fd4d53f862fc6ad05541e5bf60a3b.zip
external_mesa3d-f84c830b144fd4d53f862fc6ad05541e5bf60a3b.tar.gz
external_mesa3d-f84c830b144fd4d53f862fc6ad05541e5bf60a3b.tar.bz2
svga: update shader code for GBS
Reviewed-by: Thomas Hellstrom <thellstrom@vmware.com> Cc: "10.1" <mesa-stable@lists.freedesktop.org>
Diffstat (limited to 'src/gallium/drivers/svga/svga_state_fs.c')
-rw-r--r--src/gallium/drivers/svga/svga_state_fs.c58
1 files changed, 47 insertions, 11 deletions
diff --git a/src/gallium/drivers/svga/svga_state_fs.c b/src/gallium/drivers/svga/svga_state_fs.c
index 7119a19..dde739c 100644
--- a/src/gallium/drivers/svga/svga_state_fs.c
+++ b/src/gallium/drivers/svga/svga_state_fs.c
@@ -321,13 +321,36 @@ make_fs_key(const struct svga_context *svga,
}
+/**
+ * svga_reemit_fs_bindings - Reemit the fragment shader bindings
+ */
+enum pipe_error
+svga_reemit_fs_bindings(struct svga_context *svga)
+{
+ enum pipe_error ret;
+
+ assert(svga->rebind.fs);
+ assert(svga_have_gb_objects(svga));
+
+ if (!svga->state.hw_draw.fs)
+ return PIPE_OK;
+
+ ret = SVGA3D_SetGBShader(svga->swc, SVGA3D_SHADERTYPE_PS,
+ svga->state.hw_draw.fs->gb_shader);
+ if (ret != PIPE_OK)
+ return ret;
+
+ svga->rebind.fs = FALSE;
+ return PIPE_OK;
+}
+
+
+
static enum pipe_error
emit_hw_fs(struct svga_context *svga, unsigned dirty)
{
struct svga_shader_variant *variant = NULL;
- unsigned id = SVGA3D_INVALID_ID;
enum pipe_error ret = PIPE_OK;
-
struct svga_fragment_shader *fs = svga->curr.fs;
struct svga_fs_compile_key key;
@@ -349,17 +372,30 @@ emit_hw_fs(struct svga_context *svga, unsigned dirty)
return ret;
}
- assert (variant);
- id = variant->id;
-
- assert(id != SVGA3D_INVALID_ID);
+ assert(variant);
if (variant != svga->state.hw_draw.fs) {
- ret = SVGA3D_SetShader(svga->swc,
- SVGA3D_SHADERTYPE_PS,
- id );
- if (ret != PIPE_OK)
- return ret;
+ if (svga_have_gb_objects(svga)) {
+ /*
+ * Bind is necessary here only because pipebuffer_fenced may move
+ * the shader contents around....
+ */
+ ret = SVGA3D_BindGBShader(svga->swc, variant->gb_shader);
+ if (ret != PIPE_OK)
+ return ret;
+
+ ret = SVGA3D_SetGBShader(svga->swc, SVGA3D_SHADERTYPE_PS,
+ variant->gb_shader);
+ if (ret != PIPE_OK)
+ return ret;
+
+ svga->rebind.fs = FALSE;
+ }
+ else {
+ ret = SVGA3D_SetShader(svga->swc, SVGA3D_SHADERTYPE_PS, variant->id);
+ if (ret != PIPE_OK)
+ return ret;
+ }
svga->dirty |= SVGA_NEW_FS_VARIANT;
svga->state.hw_draw.fs = variant;