summaryrefslogtreecommitdiffstats
path: root/src/mesa/state_tracker
diff options
context:
space:
mode:
authorDave Airlie <[email protected]>2010-04-27 21:06:44 +1000
committerDave Airlie <[email protected]>2010-06-05 16:53:43 +1000
commit42ebe3dfd9b0803913e0d932909ca5872d937c20 (patch)
tree068455a7a71c343f7bfed217d9418d60123fed71 /src/mesa/state_tracker
parentf855e16afa086edfc2f03360a27f66c955a6c208 (diff)
mesa/st: add support for EXT_texture_swizzle.
This passes on r300g, the only bit I'm not really sure about is the handling of the sampler_view in st_atom_texture.c, I unreference it there if the swizzle value changes and I also have to create a new set of functions to create a new one since the u_sampler.c ones don't handle swizzle so much. adds r300g + softpipe enables, I think other drivers could pass easily enough. Signed-off-by: Dave Airlie <[email protected]>
Diffstat (limited to 'src/mesa/state_tracker')
-rw-r--r--src/mesa/state_tracker/st_atom_texture.c57
-rw-r--r--src/mesa/state_tracker/st_extensions.c4
2 files changed, 59 insertions, 2 deletions
diff --git a/src/mesa/state_tracker/st_atom_texture.c b/src/mesa/state_tracker/st_atom_texture.c
index d403b7db1e5..65b57f15911 100644
--- a/src/mesa/state_tracker/st_atom_texture.c
+++ b/src/mesa/state_tracker/st_atom_texture.c
@@ -33,6 +33,7 @@
#include "main/macros.h"
+#include "shader/prog_instruction.h"
#include "st_context.h"
#include "st_atom.h"
@@ -42,6 +43,54 @@
#include "util/u_inlines.h"
#include "cso_cache/cso_context.h"
+static boolean check_sampler_swizzle(struct pipe_sampler_view *sv,
+ uint32_t _swizzle)
+{
+ if ((sv->swizzle_r != GET_SWZ(_swizzle, 0)) ||
+ (sv->swizzle_g != GET_SWZ(_swizzle, 1)) ||
+ (sv->swizzle_b != GET_SWZ(_swizzle, 2)) ||
+ (sv->swizzle_a != GET_SWZ(_swizzle, 3)))
+ return true;
+ return false;
+}
+
+static INLINE struct pipe_sampler_view *
+st_create_texture_sampler_view_from_stobj(struct pipe_context *pipe,
+ struct st_texture_object *stObj)
+
+{
+ struct pipe_sampler_view templ;
+
+ u_sampler_view_default_template(&templ,
+ stObj->pt,
+ stObj->pt->format);
+
+ if (stObj->base._Swizzle != SWIZZLE_NOOP) {
+ templ.swizzle_r = GET_SWZ(stObj->base._Swizzle, 0);
+ templ.swizzle_g = GET_SWZ(stObj->base._Swizzle, 1);
+ templ.swizzle_b = GET_SWZ(stObj->base._Swizzle, 2);
+ templ.swizzle_a = GET_SWZ(stObj->base._Swizzle, 3);
+ }
+
+ return pipe->create_sampler_view(pipe, stObj->pt, &templ);
+}
+
+
+static INLINE struct pipe_sampler_view *
+st_get_texture_sampler_view_from_stobj(struct st_texture_object *stObj,
+ struct pipe_context *pipe)
+
+{
+ if (!stObj || !stObj->pt) {
+ return NULL;
+ }
+
+ if (!stObj->sampler_view) {
+ stObj->sampler_view = st_create_texture_sampler_view_from_stobj(pipe, stObj);
+ }
+
+ return stObj->sampler_view;
+}
static void
update_textures(struct st_context *st)
@@ -85,9 +134,13 @@ update_textures(struct st_context *st)
st->state.num_textures = su + 1;
- sampler_view = st_get_texture_sampler_view(stObj, pipe);
- }
+ /* if sampler view has changed dereference it */
+ if (stObj->sampler_view)
+ if (check_sampler_swizzle(stObj->sampler_view, stObj->base._Swizzle))
+ pipe_sampler_view_reference(&stObj->sampler_view, NULL);
+ sampler_view = st_get_texture_sampler_view_from_stobj(stObj, pipe);
+ }
pipe_sampler_view_reference(&st->state.sampler_views[su], sampler_view);
}
diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c
index 4093eedde9a..2c2e10dead7 100644
--- a/src/mesa/state_tracker/st_extensions.c
+++ b/src/mesa/state_tracker/st_extensions.c
@@ -248,6 +248,10 @@ void st_init_extensions(struct st_context *st)
ctx->Extensions.ARB_draw_buffers = GL_TRUE;
}
+ if (screen->get_param(screen, PIPE_CAP_TEXTURE_SWIZZLE) > 0) {
+ ctx->Extensions.EXT_texture_swizzle = GL_TRUE;
+ }
+
if (screen->get_param(screen, PIPE_CAP_GLSL)) {
ctx->Extensions.ARB_fragment_shader = GL_TRUE;
ctx->Extensions.ARB_vertex_shader = GL_TRUE;