summaryrefslogtreecommitdiffstats
path: root/src/mesa/state_tracker
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/state_tracker')
-rw-r--r--src/mesa/state_tracker/st_atom.c2
-rw-r--r--src/mesa/state_tracker/st_atom.h2
-rw-r--r--src/mesa/state_tracker/st_atom_setup.c95
-rw-r--r--src/mesa/state_tracker/st_cache.c18
-rw-r--r--src/mesa/state_tracker/st_cache.h6
-rw-r--r--src/mesa/state_tracker/st_cb_clear.c12
-rw-r--r--src/mesa/state_tracker/st_cb_drawpixels.c8
-rw-r--r--src/mesa/state_tracker/st_context.h2
-rw-r--r--src/mesa/state_tracker/st_draw.c2
9 files changed, 88 insertions, 59 deletions
diff --git a/src/mesa/state_tracker/st_atom.c b/src/mesa/state_tracker/st_atom.c
index 99d0bcb90bb..a4af3aeb205 100644
--- a/src/mesa/state_tracker/st_atom.c
+++ b/src/mesa/state_tracker/st_atom.c
@@ -53,7 +53,7 @@ static const struct st_tracked_state *atoms[] =
&st_update_vs,
&st_update_fs,
- &st_update_setup,
+ &st_update_rasterizer,
&st_update_polygon_stipple,
&st_update_viewport,
&st_update_scissor,
diff --git a/src/mesa/state_tracker/st_atom.h b/src/mesa/state_tracker/st_atom.h
index 0e362b1fbf1..26f6514698c 100644
--- a/src/mesa/state_tracker/st_atom.h
+++ b/src/mesa/state_tracker/st_atom.h
@@ -51,7 +51,7 @@ const struct st_tracked_state st_update_depth_stencil;
const struct st_tracked_state st_update_tnl;
const struct st_tracked_state st_update_fs;
const struct st_tracked_state st_update_vs;
-const struct st_tracked_state st_update_setup;
+const struct st_tracked_state st_update_rasterizer;
const struct st_tracked_state st_update_polygon_stipple;
const struct st_tracked_state st_update_viewport;
const struct st_tracked_state st_update_scissor;
diff --git a/src/mesa/state_tracker/st_atom_setup.c b/src/mesa/state_tracker/st_atom_setup.c
index 09d921560d2..cab8ad5cd6c 100644
--- a/src/mesa/state_tracker/st_atom_setup.c
+++ b/src/mesa/state_tracker/st_atom_setup.c
@@ -32,6 +32,7 @@
#include "st_context.h"
+#include "st_cache.h"
#include "pipe/p_context.h"
#include "pipe/p_defines.h"
#include "st_atom.h"
@@ -68,20 +69,21 @@ static GLboolean get_offset_flag( GLuint fill_mode,
}
-static void update_setup_state( struct st_context *st )
+static void update_raster_state( struct st_context *st )
{
GLcontext *ctx = st->ctx;
- struct pipe_setup_state setup;
+ struct pipe_rasterizer_state raster;
+ const struct pipe_rasterizer_state *cached;
- memset(&setup, 0, sizeof(setup));
+ memset(&raster, 0, sizeof(raster));
/* _NEW_POLYGON, _NEW_BUFFERS
*/
{
if (ctx->Polygon.FrontFace == GL_CCW)
- setup.front_winding = PIPE_WINDING_CCW;
+ raster.front_winding = PIPE_WINDING_CCW;
else
- setup.front_winding = PIPE_WINDING_CW;
+ raster.front_winding = PIPE_WINDING_CW;
/* XXX
* I think the intention here is that user-created framebuffer objects
@@ -90,13 +92,13 @@ static void update_setup_state( struct st_context *st )
* But this is an implementation/driver-specific artifact - remove...
*/
if (ctx->DrawBuffer && ctx->DrawBuffer->Name != 0)
- setup.front_winding ^= PIPE_WINDING_BOTH;
+ raster.front_winding ^= PIPE_WINDING_BOTH;
}
/* _NEW_LIGHT
*/
if (ctx->Light.ShadeModel == GL_FLAT)
- setup.flatshade = 1;
+ raster.flatshade = 1;
/* _NEW_LIGHT | _NEW_PROGRAM
*
@@ -105,23 +107,23 @@ static void update_setup_state( struct st_context *st )
* GL_VERTEX_PROGRAM_TWO_SIDE is set). Note the logic here.
*/
if (ctx->VertexProgram._Enabled) {
- setup.light_twoside = ctx->VertexProgram.TwoSideEnabled;
+ raster.light_twoside = ctx->VertexProgram.TwoSideEnabled;
}
else if (ctx->Light.Enabled && ctx->Light.Model.TwoSide) {
- setup.light_twoside = 1;
+ raster.light_twoside = 1;
}
/* _NEW_POLYGON
*/
if (ctx->Polygon.CullFlag) {
if (ctx->Polygon.CullFaceMode == GL_FRONT_AND_BACK) {
- setup.cull_mode = PIPE_WINDING_BOTH;
+ raster.cull_mode = PIPE_WINDING_BOTH;
}
else if (ctx->Polygon.CullFaceMode == GL_FRONT) {
- setup.cull_mode = setup.front_winding;
+ raster.cull_mode = raster.front_winding;
}
else {
- setup.cull_mode = setup.front_winding ^ PIPE_WINDING_BOTH;
+ raster.cull_mode = raster.front_winding ^ PIPE_WINDING_BOTH;
}
}
@@ -131,23 +133,23 @@ static void update_setup_state( struct st_context *st )
GLuint fill_front = translate_fill( ctx->Polygon.FrontMode );
GLuint fill_back = translate_fill( ctx->Polygon.BackMode );
- if (setup.front_winding == PIPE_WINDING_CW) {
- setup.fill_cw = fill_front;
- setup.fill_ccw = fill_back;
+ if (raster.front_winding == PIPE_WINDING_CW) {
+ raster.fill_cw = fill_front;
+ raster.fill_ccw = fill_back;
}
else {
- setup.fill_cw = fill_back;
- setup.fill_ccw = fill_front;
+ raster.fill_cw = fill_back;
+ raster.fill_ccw = fill_front;
}
/* Simplify when culling is active:
*/
- if (setup.cull_mode & PIPE_WINDING_CW) {
- setup.fill_cw = setup.fill_ccw;
+ if (raster.cull_mode & PIPE_WINDING_CW) {
+ raster.fill_cw = raster.fill_ccw;
}
- if (setup.cull_mode & PIPE_WINDING_CCW) {
- setup.fill_ccw = setup.fill_cw;
+ if (raster.cull_mode & PIPE_WINDING_CCW) {
+ raster.fill_ccw = raster.fill_cw;
}
}
@@ -155,67 +157,68 @@ static void update_setup_state( struct st_context *st )
*/
if (ctx->Polygon.OffsetUnits != 0.0 ||
ctx->Polygon.OffsetFactor != 0.0) {
- setup.offset_cw = get_offset_flag( setup.fill_cw, &ctx->Polygon );
- setup.offset_ccw = get_offset_flag( setup.fill_ccw, &ctx->Polygon );
- setup.offset_units = ctx->Polygon.OffsetUnits;
- setup.offset_scale = ctx->Polygon.OffsetFactor;
+ raster.offset_cw = get_offset_flag( raster.fill_cw, &ctx->Polygon );
+ raster.offset_ccw = get_offset_flag( raster.fill_ccw, &ctx->Polygon );
+ raster.offset_units = ctx->Polygon.OffsetUnits;
+ raster.offset_scale = ctx->Polygon.OffsetFactor;
}
if (ctx->Polygon.SmoothFlag)
- setup.poly_smooth = 1;
+ raster.poly_smooth = 1;
if (ctx->Polygon.StippleFlag)
- setup.poly_stipple_enable = 1;
+ raster.poly_stipple_enable = 1;
/* _NEW_BUFFERS, _NEW_POLYGON
*/
- if (setup.fill_cw != PIPE_POLYGON_MODE_FILL ||
- setup.fill_ccw != PIPE_POLYGON_MODE_FILL)
+ if (raster.fill_cw != PIPE_POLYGON_MODE_FILL ||
+ raster.fill_ccw != PIPE_POLYGON_MODE_FILL)
{
GLfloat mrd = (ctx->DrawBuffer ?
ctx->DrawBuffer->_MRD :
1.0);
- setup.offset_units = ctx->Polygon.OffsetFactor * mrd;
- setup.offset_scale = (ctx->Polygon.OffsetUnits * mrd *
+ raster.offset_units = ctx->Polygon.OffsetFactor * mrd;
+ raster.offset_scale = (ctx->Polygon.OffsetUnits * mrd *
st->polygon_offset_scale);
}
/* _NEW_POINT
*/
- setup.point_size = ctx->Point.Size;
- setup.point_smooth = ctx->Point.SmoothFlag;
+ raster.point_size = ctx->Point.Size;
+ raster.point_smooth = ctx->Point.SmoothFlag;
/* _NEW_LINE
*/
- setup.line_width = ctx->Line.Width;
- setup.line_smooth = ctx->Line.SmoothFlag;
- setup.line_stipple_enable = ctx->Line.StippleFlag;
- setup.line_stipple_pattern = ctx->Line.StipplePattern;
+ raster.line_width = ctx->Line.Width;
+ raster.line_smooth = ctx->Line.SmoothFlag;
+ raster.line_stipple_enable = ctx->Line.StippleFlag;
+ raster.line_stipple_pattern = ctx->Line.StipplePattern;
/* GL stipple factor is in [1,256], remap to [0, 255] here */
- setup.line_stipple_factor = ctx->Line.StippleFactor - 1;
+ raster.line_stipple_factor = ctx->Line.StippleFactor - 1;
/* _NEW_MULTISAMPLE */
if (ctx->Multisample.Enabled)
- setup.multisample = 1;
+ raster.multisample = 1;
/* _NEW_SCISSOR */
if (ctx->Scissor.Enabled)
- setup.scissor = 1;
+ raster.scissor = 1;
- if (memcmp(&setup, &st->state.setup, sizeof(setup)) != 0) {
- st->state.setup = setup;
- st->pipe->set_setup_state( st->pipe, &setup );
+ cached = st_cached_rasterizer_state(st, &raster);
+ if (st->state.rasterizer != cached) {
+ st->state.rasterizer = cached;
+ st->pipe->bind_rasterizer_state( st->pipe, cached );
}
}
-const struct st_tracked_state st_update_setup = {
- .name = "st_update_setup",
+const struct st_tracked_state st_update_rasterizer = {
+ .name = "st_update_rasterizer",
.dirty = {
.mesa = (_NEW_LIGHT | _NEW_POLYGON | _NEW_LINE | _NEW_SCISSOR |
_NEW_POINT | _NEW_BUFFERS | _NEW_MULTISAMPLE),
.st = 0,
},
- .update = update_setup_state
+ .update = update_raster_state
};
diff --git a/src/mesa/state_tracker/st_cache.c b/src/mesa/state_tracker/st_cache.c
index 64c03be99db..a687c155874 100644
--- a/src/mesa/state_tracker/st_cache.c
+++ b/src/mesa/state_tracker/st_cache.c
@@ -93,3 +93,21 @@ struct pipe_depth_stencil_state * st_cached_depth_stencil_state(
}
return (struct pipe_depth_stencil_state*)(cso_hash_iter_data(iter));
}
+
+struct pipe_rasterizer_state * st_cached_rasterizer_state(
+ struct st_context *st,
+ const struct pipe_rasterizer_state *raster)
+{
+ unsigned hash_key = cso_construct_key((void*)raster,
+ sizeof(struct pipe_rasterizer_state));
+ struct cso_hash_iter iter = cso_find_state_template(st->cache,
+ hash_key, CSO_RASTERIZER,
+ (void*)raster);
+ if (cso_hash_iter_is_null(iter)) {
+ const struct pipe_rasterizer_state *created_state =
+ st->pipe->create_rasterizer_state(st->pipe, raster);
+ iter = cso_insert_state(st->cache, hash_key, CSO_RASTERIZER,
+ (void*)created_state);
+ }
+ return (struct pipe_rasterizer_state*)(cso_hash_iter_data(iter));
+}
diff --git a/src/mesa/state_tracker/st_cache.h b/src/mesa/state_tracker/st_cache.h
index 78cb2e774e1..a06af311237 100644
--- a/src/mesa/state_tracker/st_cache.h
+++ b/src/mesa/state_tracker/st_cache.h
@@ -47,6 +47,10 @@ struct pipe_sampler_state * st_cached_sampler_state(
struct pipe_depth_stencil_state *st_cached_depth_stencil_state(
struct st_context *st,
- const struct pipe_depth_stencil_state *sampler);
+ const struct pipe_depth_stencil_state *depth_stencil);
+
+struct pipe_rasterizer_state *st_cached_rasterizer_state(
+ struct st_context *st,
+ const struct pipe_rasterizer_state *raster);
#endif
diff --git a/src/mesa/state_tracker/st_cb_clear.c b/src/mesa/state_tracker/st_cb_clear.c
index e9aabd15b58..584bc1cc2ae 100644
--- a/src/mesa/state_tracker/st_cb_clear.c
+++ b/src/mesa/state_tracker/st_cb_clear.c
@@ -329,16 +329,18 @@ clear_with_quad(GLcontext *ctx,
/* setup state: nothing */
{
- struct pipe_setup_state setup;
- memset(&setup, 0, sizeof(setup));
+ struct pipe_rasterizer_state raster;
+ const struct pipe_rasterizer_state *cached;
+ 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)
- setup.scissor = 1;
+ raster.scissor = 1;
#endif
- pipe->set_setup_state(pipe, &setup);
+ cached = st_cached_rasterizer_state(ctx->st, &raster);
+ pipe->bind_rasterizer_state(pipe, cached);
}
/* fragment shader state: color pass-through program */
@@ -394,7 +396,7 @@ clear_with_quad(GLcontext *ctx,
pipe->bind_depth_stencil_state(pipe, st->state.depth_stencil);
pipe->set_fs_state(pipe, &st->state.fs);
pipe->set_vs_state(pipe, &st->state.vs);
- pipe->set_setup_state(pipe, &st->state.setup);
+ pipe->bind_rasterizer_state(pipe, st->state.rasterizer);
pipe->set_viewport_state(pipe, &ctx->st->state.viewport);
/* OR:
st_invalidate_state(ctx, _NEW_COLOR | _NEW_DEPTH | _NEW_STENCIL);
diff --git a/src/mesa/state_tracker/st_cb_drawpixels.c b/src/mesa/state_tracker/st_cb_drawpixels.c
index a0012e3a8c3..78ede8e2250 100644
--- a/src/mesa/state_tracker/st_cb_drawpixels.c
+++ b/src/mesa/state_tracker/st_cb_drawpixels.c
@@ -316,11 +316,13 @@ draw_textured_quad(GLcontext *ctx, GLint x, GLint y, GLfloat z,
/* setup state: just scissor */
{
- struct pipe_setup_state setup;
+ struct pipe_rasterizer_state setup;
+ struct pipe_rasterizer_state *cached;
memset(&setup, 0, sizeof(setup));
if (ctx->Scissor.Enabled)
setup.scissor = 1;
- pipe->set_setup_state(pipe, &setup);
+ cached = st_cached_rasterizer_state(ctx->st, &setup);
+ pipe->bind_rasterizer_state(pipe, cached);
}
/* fragment shader state: TEX lookup program */
@@ -400,7 +402,7 @@ draw_textured_quad(GLcontext *ctx, GLint x, GLint y, GLfloat z,
draw_quad(ctx, x0, y0, z, x1, y1);
/* restore GL state */
- pipe->set_setup_state(pipe, &ctx->st->state.setup);
+ pipe->bind_rasterizer_state(pipe, ctx->st->state.rasterizer);
pipe->set_fs_state(pipe, &ctx->st->state.fs);
pipe->set_vs_state(pipe, &ctx->st->state.vs);
pipe->set_texture_state(pipe, unit, ctx->st->state.texture[unit]);
diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h
index 7c887d0b559..516d319a6ee 100644
--- a/src/mesa/state_tracker/st_context.h
+++ b/src/mesa/state_tracker/st_context.h
@@ -77,6 +77,7 @@ struct st_context
const struct pipe_blend_state *blend;
const struct pipe_sampler_state *sampler[PIPE_MAX_SAMPLERS];
const struct pipe_depth_stencil_state *depth_stencil;
+ const struct pipe_rasterizer_state *rasterizer;
struct pipe_alpha_test_state alpha_test;
struct pipe_blend_color blend_color;
@@ -88,7 +89,6 @@ struct st_context
struct pipe_mipmap_tree *texture[PIPE_MAX_SAMPLERS];
struct pipe_poly_stipple poly_stipple;
struct pipe_scissor_state scissor;
- struct pipe_setup_state setup;
struct pipe_shader_state fs;
struct pipe_shader_state vs;
struct pipe_viewport_state viewport;
diff --git a/src/mesa/state_tracker/st_draw.c b/src/mesa/state_tracker/st_draw.c
index 69f4b7fa5b0..1ea7799021b 100644
--- a/src/mesa/state_tracker/st_draw.c
+++ b/src/mesa/state_tracker/st_draw.c
@@ -394,7 +394,7 @@ st_feedback_draw_vbo(GLcontext *ctx,
assert(draw);
draw_set_viewport_state(draw, &st->state.viewport);
draw_set_clip_state(draw, &st->state.clip);
- draw_set_setup_state(draw, &st->state.setup);
+ draw_set_setup_state(draw, st->state.rasterizer);
draw_set_vertex_shader(draw, &st->state.vs);
/* XXX need to set vertex info too */