summaryrefslogtreecommitdiffstats
path: root/src/mesa
diff options
context:
space:
mode:
authorBrian <[email protected]>2008-03-19 11:12:48 -0600
committerBrian <[email protected]>2008-03-19 11:14:18 -0600
commit7d95efde0a0e13e13c59444703bc47eb13926385 (patch)
tree807dbe0e71c0c98534fef1957b7317acd306c3a5 /src/mesa
parent1213c7257335d577cf0217e34edafddf0451ba1b (diff)
gallium: implement CSO save/restore functions for use by meta operations (blit, gen-mipmaps, quad-clear, etc)
Also, additional cso_set_*() functions for viewport, framebuffer, blend color, etc. state.
Diffstat (limited to 'src/mesa')
-rw-r--r--src/mesa/state_tracker/st_atom_blend.c12
-rw-r--r--src/mesa/state_tracker/st_atom_framebuffer.c9
-rw-r--r--src/mesa/state_tracker/st_atom_viewport.c26
-rw-r--r--src/mesa/state_tracker/st_cb_blit.c17
-rw-r--r--src/mesa/state_tracker/st_cb_clear.c35
-rw-r--r--src/mesa/state_tracker/st_cb_drawpixels.c25
-rw-r--r--src/mesa/state_tracker/st_context.h1
-rw-r--r--src/mesa/state_tracker/st_gen_mipmap.c20
8 files changed, 51 insertions, 94 deletions
diff --git a/src/mesa/state_tracker/st_atom_blend.c b/src/mesa/state_tracker/st_atom_blend.c
index 6c13fc81415..2a0e92245c8 100644
--- a/src/mesa/state_tracker/st_atom_blend.c
+++ b/src/mesa/state_tracker/st_atom_blend.c
@@ -39,6 +39,7 @@
#include "pipe/p_defines.h"
#include "cso_cache/cso_context.h"
+#include "main/macros.h"
/**
* Convert GLenum blend tokens to pipe tokens.
@@ -213,13 +214,10 @@ update_blend( struct st_context *st )
cso_set_blend(st->cso_context, blend);
- if (memcmp(st->ctx->Color.BlendColor, &st->state.blend_color, 4 * sizeof(GLfloat)) != 0) {
- /* state has changed */
- st->state.blend_color.color[0] = st->ctx->Color.BlendColor[0];
- st->state.blend_color.color[1] = st->ctx->Color.BlendColor[1];
- st->state.blend_color.color[2] = st->ctx->Color.BlendColor[2];
- st->state.blend_color.color[3] = st->ctx->Color.BlendColor[3];
- st->pipe->set_blend_color(st->pipe, (struct pipe_blend_color *) st->ctx->Color.BlendColor);
+ {
+ struct pipe_blend_color bc;
+ COPY_4FV(bc.color, st->ctx->Color.BlendColor);
+ cso_set_blend_color(st->cso_context, &bc);
}
}
diff --git a/src/mesa/state_tracker/st_atom_framebuffer.c b/src/mesa/state_tracker/st_atom_framebuffer.c
index 3e58d49f1fb..c8fa0cbdfb6 100644
--- a/src/mesa/state_tracker/st_atom_framebuffer.c
+++ b/src/mesa/state_tracker/st_atom_framebuffer.c
@@ -35,6 +35,7 @@
#include "st_atom.h"
#include "st_cb_fbo.h"
#include "pipe/p_context.h"
+#include "cso_cache/cso_context.h"
/**
@@ -76,13 +77,7 @@ update_framebuffer_state( struct st_context *st )
}
}
- /* XXX: The memcmp is insufficient for eliminating redundant state changes,
- * but we should probably do more work here to that end.
- */
- if (1 /*memcmp(&framebuffer, &st->state.framebuffer, sizeof(framebuffer)) != 0*/) {
- st->state.framebuffer = framebuffer;
- st->pipe->set_framebuffer_state( st->pipe, &framebuffer );
- }
+ cso_set_framebuffer(st->cso_context, &framebuffer);
}
diff --git a/src/mesa/state_tracker/st_atom_viewport.c b/src/mesa/state_tracker/st_atom_viewport.c
index 147aa3c51a7..eb3f62cfbea 100644
--- a/src/mesa/state_tracker/st_atom_viewport.c
+++ b/src/mesa/state_tracker/st_atom_viewport.c
@@ -29,9 +29,9 @@
#include "context.h"
#include "colormac.h"
#include "st_context.h"
-#include "pipe/p_context.h"
#include "st_atom.h"
-
+#include "pipe/p_context.h"
+#include "cso_cache/cso_context.h"
/**
* Update the viewport transformation matrix. Depends on:
@@ -65,22 +65,18 @@ update_viewport( struct st_context *st )
GLfloat half_width = ctx->Viewport.Width / 2.0;
GLfloat half_height = ctx->Viewport.Height / 2.0;
GLfloat half_depth = (ctx->Viewport.Far - ctx->Viewport.Near) / 2.0;
- struct pipe_viewport_state vp;
- vp.scale[0] = half_width;
- vp.scale[1] = half_height * yScale;
- vp.scale[2] = half_depth;
- vp.scale[3] = 1.0;
+ st->state.viewport.scale[0] = half_width;
+ st->state.viewport.scale[1] = half_height * yScale;
+ st->state.viewport.scale[2] = half_depth;
+ st->state.viewport.scale[3] = 1.0;
- vp.translate[0] = half_width + x;
- vp.translate[1] = (half_height + y) * yScale + yBias;
- vp.translate[2] = half_depth + z;
- vp.translate[3] = 0.0;
+ st->state.viewport.translate[0] = half_width + x;
+ st->state.viewport.translate[1] = (half_height + y) * yScale + yBias;
+ st->state.viewport.translate[2] = half_depth + z;
+ st->state.viewport.translate[3] = 0.0;
- if (memcmp(&vp, &st->state.viewport, sizeof(vp)) != 0) {
- st->state.viewport = vp;
- st->pipe->set_viewport_state(st->pipe, &vp);
- }
+ cso_set_viewport(st->cso_context, &st->state.viewport);
}
}
diff --git a/src/mesa/state_tracker/st_cb_blit.c b/src/mesa/state_tracker/st_cb_blit.c
index dfa79c975c1..64314a5078f 100644
--- a/src/mesa/state_tracker/st_cb_blit.c
+++ b/src/mesa/state_tracker/st_cb_blit.c
@@ -52,7 +52,7 @@
void
st_init_blit(struct st_context *st)
{
- st->blit = util_create_blit(st->pipe);
+ st->blit = util_create_blit(st->pipe, st->cso_context);
}
@@ -98,22 +98,9 @@ st_BlitFramebuffer(GLcontext *ctx,
}
-#if 0
- /* XXX is this sufficient? */
- st_invalidate_state(ctx, _NEW_COLOR | _NEW_TEXTURE);
-#else
- /* need to "unset" cso state because we went behind the back of the cso
- * tracker. Without unset, the _set_ calls would be no-ops.
- */
- cso_unset_blend(st->cso_context);
- cso_unset_depth_stencil_alpha(st->cso_context);
- cso_unset_rasterizer(st->cso_context);
- cso_set_blend(st->cso_context, &st->state.blend);
- cso_set_depth_stencil_alpha(st->cso_context, &st->state.depth_stencil);
- cso_set_rasterizer(st->cso_context, &st->state.rasterizer);
+ /* shaders don't go through CSO yet */
pipe->bind_fs_state(pipe, st->fp->driver_shader);
pipe->bind_vs_state(pipe, st->vp->driver_shader);
-#endif
}
diff --git a/src/mesa/state_tracker/st_cb_clear.c b/src/mesa/state_tracker/st_cb_clear.c
index 693cddedf75..c23938dc681 100644
--- a/src/mesa/state_tracker/st_cb_clear.c
+++ b/src/mesa/state_tracker/st_cb_clear.c
@@ -247,10 +247,19 @@ clear_with_quad(GLcontext *ctx,
x1, y1);
*/
+ cso_save_blend(st->cso_context);
+ cso_save_depth_stencil_alpha(st->cso_context);
+ cso_save_rasterizer(st->cso_context);
+ cso_save_viewport(st->cso_context);
+
/* blend state: RGBA masking */
{
struct pipe_blend_state blend;
memset(&blend, 0, sizeof(blend));
+ blend.rgb_src_factor = PIPE_BLENDFACTOR_ONE;
+ blend.alpha_src_factor = PIPE_BLENDFACTOR_ONE;
+ blend.rgb_dst_factor = PIPE_BLENDFACTOR_ZERO;
+ blend.alpha_dst_factor = PIPE_BLENDFACTOR_ZERO;
if (color) {
if (ctx->Color.ColorMask[0])
blend.colormask |= PIPE_MASK_R;
@@ -294,13 +303,6 @@ clear_with_quad(GLcontext *ctx,
{
struct pipe_rasterizer_state raster;
memset(&raster, 0, sizeof(raster));
-#if 0
- /* don't do per-pixel scissor; we'll just draw a PIPE_PRIM_QUAD
- * that matches the scissor bounds.
- */
- if (ctx->Scissor.Enabled)
- raster.scissor = 1;
-#endif
#if TEST_DRAW_PASSTHROUGH
raster.bypass_clipping = 1;
raster.bypass_vs = 1;
@@ -342,28 +344,21 @@ clear_with_quad(GLcontext *ctx,
vp.translate[1] = 0.5 * height;
vp.translate[2] = 0.0;
vp.translate[3] = 0.0;
- pipe->set_viewport_state(pipe, &vp);
+ cso_set_viewport(st->cso_context, &vp);
}
#endif
/* draw quad matching scissor rect (XXX verify coord round-off) */
draw_quad(ctx, x0, y0, x1, y1, ctx->Depth.Clear, ctx->Color.ClearColor);
-#if 0
- /* Can't depend on old state objects still existing -- may have
- * been deleted to make room in the hash, etc. (Should get
- * fixed...)
- */
- st_invalidate_state(ctx, _NEW_COLOR | _NEW_DEPTH | _NEW_STENCIL);
-#else
/* Restore pipe state */
- cso_set_blend(st->cso_context, &st->state.blend);
- cso_set_depth_stencil_alpha(st->cso_context, &st->state.depth_stencil);
- cso_set_rasterizer(st->cso_context, &st->state.rasterizer);
+ cso_restore_blend(st->cso_context);
+ cso_restore_depth_stencil_alpha(st->cso_context);
+ cso_restore_rasterizer(st->cso_context);
+ cso_restore_viewport(st->cso_context);
+ /* these don't go through cso yet */
pipe->bind_fs_state(pipe, st->fp->driver_shader);
pipe->bind_vs_state(pipe, st->vp->driver_shader);
-#endif
- pipe->set_viewport_state(pipe, &st->state.viewport);
}
diff --git a/src/mesa/state_tracker/st_cb_drawpixels.c b/src/mesa/state_tracker/st_cb_drawpixels.c
index 18ec9645c44..33d34445ee0 100644
--- a/src/mesa/state_tracker/st_cb_drawpixels.c
+++ b/src/mesa/state_tracker/st_cb_drawpixels.c
@@ -650,6 +650,9 @@ draw_textured_quad(GLcontext *ctx, GLint x, GLint y, GLfloat z,
assert(width <= maxSize);
assert(height <= maxSize);
+ cso_save_rasterizer(cso);
+ cso_save_viewport(cso);
+
/* setup state: just scissor */
{
struct pipe_rasterizer_state setup;
@@ -696,7 +699,7 @@ draw_textured_quad(GLcontext *ctx, GLint x, GLint y, GLfloat z,
vp.translate[1] = 0.5 * height;
vp.translate[2] = 0.0;
vp.translate[3] = 0.0;
- pipe->set_viewport_state(pipe, &vp);
+ cso_set_viewport(cso, &vp);
}
/* texture state: */
@@ -719,26 +722,18 @@ draw_textured_quad(GLcontext *ctx, GLint x, GLint y, GLfloat z,
else
draw_quad(ctx, x0, y0, z, x1, y1, invertTex);
- /* restore GL state */
- pipe->set_sampler_textures(pipe, ctx->st->state.num_textures,
- ctx->st->state.sampler_texture);
-
- pipe->set_viewport_state(pipe, &ctx->st->state.viewport);
-
-#if 0
- /* Can't depend on old state objects still existing -- may have
- * been deleted to make room in the hash, etc. (Should get
- * fixed...)
- */
- st_invalidate_state(ctx, _NEW_COLOR | _NEW_TEXTURE);
-#else
/* restore state */
+ cso_restore_rasterizer(cso);
+ cso_restore_viewport(cso);
+ /* shaders don't go through cso yet */
pipe->bind_fs_state(pipe, st->fp->driver_shader);
pipe->bind_vs_state(pipe, st->vp->driver_shader);
+
cso_set_rasterizer(cso, &st->state.rasterizer);
cso_set_samplers(cso, PIPE_MAX_SAMPLERS,
(const struct pipe_sampler_state **) st->state.sampler_list);
-#endif
+ pipe->set_sampler_textures(pipe, ctx->st->state.num_textures,
+ ctx->st->state.sampler_texture);
}
diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h
index 63150dbeaf6..ca8307c4ba0 100644
--- a/src/mesa/state_tracker/st_context.h
+++ b/src/mesa/state_tracker/st_context.h
@@ -82,7 +82,6 @@ struct st_context
struct pipe_rasterizer_state rasterizer;
struct pipe_sampler_state samplers[PIPE_MAX_SAMPLERS];
struct pipe_sampler_state *sampler_list[PIPE_MAX_SAMPLERS];
- struct pipe_blend_color blend_color;
struct pipe_clip_state clip;
struct pipe_constant_buffer constants[2];
struct pipe_framebuffer_state framebuffer;
diff --git a/src/mesa/state_tracker/st_gen_mipmap.c b/src/mesa/state_tracker/st_gen_mipmap.c
index 6c3afca1ba1..61e1d9621c1 100644
--- a/src/mesa/state_tracker/st_gen_mipmap.c
+++ b/src/mesa/state_tracker/st_gen_mipmap.c
@@ -59,7 +59,7 @@
void
st_init_generate_mipmap(struct st_context *st)
{
- st->gen_mipmap = util_create_gen_mipmap(st->pipe);
+ st->gen_mipmap = util_create_gen_mipmap(st->pipe, st->cso_context);
}
@@ -94,19 +94,11 @@ st_render_mipmap(struct st_context *st,
util_gen_mipmap(st->gen_mipmap, pt, face, baseLevel, lastLevel);
- /* restore pipe state */
-#if 0
- cso_set_rasterizer(st->cso_context, &st->state.rasterizer);
- cso_set_samplers(st->cso_context, st->state.samplers_list);
- pipe->bind_fs_state(pipe, st->fp->shader_program);
- pipe->bind_vs_state(pipe, st->vp->shader_program);
- pipe->set_sampler_textures(pipe, st->state.num_textures,
- st->state.sampler_texture);
- pipe->set_viewport_state(pipe, &st->state.viewport);
-#else
- /* XXX is this sufficient? */
- st_invalidate_state(st->ctx, _NEW_COLOR | _NEW_TEXTURE);
-#endif
+ /* shaders don't go through CSO yet */
+ if (st->fp)
+ pipe->bind_fs_state(pipe, st->fp->driver_shader);
+ if (st->vp)
+ pipe->bind_vs_state(pipe, st->vp->driver_shader);
return TRUE;
}