summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPaul Berry <[email protected]>2012-12-13 12:45:54 -0800
committerPaul Berry <[email protected]>2012-12-14 10:51:10 -0800
commit4bb8661b1ba69a223eb4d186ed9528525c3269f3 (patch)
tree02975e376490a777301806dce09f2dbf43b18cca /src
parent6ee500cfd28324bef27f145fbe03e77993810c45 (diff)
gallium: Disable varying packing on hardware with <=8 texture indirections.
In practice this will disable varying packing on R300, R400, i915g, and nv30. Reviewed-by: Marek Olšák <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/mesa/state_tracker/st_extensions.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c
index 726d86846a9..f3f01ebd5e4 100644
--- a/src/mesa/state_tracker/st_extensions.c
+++ b/src/mesa/state_tracker/st_extensions.c
@@ -663,4 +663,18 @@ void st_init_extensions(struct st_context *st)
}
if (screen->get_param(screen, PIPE_CAP_TEXTURE_BUFFER_OBJECTS))
ctx->Extensions.ARB_texture_buffer_object = GL_TRUE;
+
+ /* Unpacking a varying in the fragment shader costs 1 texture indirection.
+ * If the number of available texture indirections is very limited, then we
+ * prefer to disable varying packing rather than run the risk of varying
+ * packing preventing a shader from running.
+ */
+ if (screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT,
+ PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS) <= 8) {
+ /* We can't disable varying packing if transform feedback is available,
+ * because transform feedback code assumes a packed varying layout.
+ */
+ if (!ctx->Extensions.EXT_transform_feedback)
+ ctx->Const.DisableVaryingPacking = GL_TRUE;
+ }
}