summaryrefslogtreecommitdiff
path: root/src/mesa/pipe/softpipe
diff options
context:
space:
mode:
authorZack Rusin <zack@tungstengraphics.com>2007-09-17 12:59:50 -0400
committerZack Rusin <zack@tungstengraphics.com>2007-09-18 07:18:12 -0400
commit294401814d1d89cc731de1c22c25333aa5d59374 (patch)
treec392643aaed3660fe9d577044b3f928fb50c4ac7 /src/mesa/pipe/softpipe
parentd6ac959833a8e40a27907940969c622692f749b1 (diff)
converting the setup state to immutable object and renaming it to rasterizer state
Diffstat (limited to 'src/mesa/pipe/softpipe')
-rw-r--r--src/mesa/pipe/softpipe/sp_context.c4
-rw-r--r--src/mesa/pipe/softpipe/sp_context.h4
-rw-r--r--src/mesa/pipe/softpipe/sp_prim_setup.c18
-rw-r--r--src/mesa/pipe/softpipe/sp_quad.c8
-rw-r--r--src/mesa/pipe/softpipe/sp_quad_coverage.c6
-rw-r--r--src/mesa/pipe/softpipe/sp_state.h12
-rw-r--r--src/mesa/pipe/softpipe/sp_state_derived.c10
-rw-r--r--src/mesa/pipe/softpipe/sp_state_setup.c26
8 files changed, 56 insertions, 32 deletions
diff --git a/src/mesa/pipe/softpipe/sp_context.c b/src/mesa/pipe/softpipe/sp_context.c
index 9a8b55bb0e..7753ce40d7 100644
--- a/src/mesa/pipe/softpipe/sp_context.c
+++ b/src/mesa/pipe/softpipe/sp_context.c
@@ -259,6 +259,9 @@ struct pipe_context *softpipe_create( struct pipe_winsys *pipe_winsys,
softpipe->pipe.create_depth_stencil_state = softpipe_create_depth_stencil_state;
softpipe->pipe.bind_depth_stencil_state = softpipe_bind_depth_stencil_state;
softpipe->pipe.delete_depth_stencil_state = softpipe_delete_depth_stencil_state;
+ softpipe->pipe.create_rasterizer_state = softpipe_create_rasterizer_state;
+ softpipe->pipe.bind_rasterizer_state = softpipe_bind_rasterizer_state;
+ softpipe->pipe.delete_rasterizer_state = softpipe_delete_rasterizer_state;
softpipe->pipe.set_alpha_test_state = softpipe_set_alpha_test_state;
softpipe->pipe.set_blend_color = softpipe_set_blend_color;
@@ -271,7 +274,6 @@ struct pipe_context *softpipe_create( struct pipe_winsys *pipe_winsys,
softpipe->pipe.set_vs_state = softpipe_set_vs_state;
softpipe->pipe.set_polygon_stipple = softpipe_set_polygon_stipple;
softpipe->pipe.set_scissor_state = softpipe_set_scissor_state;
- softpipe->pipe.set_setup_state = softpipe_set_setup_state;
softpipe->pipe.set_texture_state = softpipe_set_texture_state;
softpipe->pipe.set_viewport_state = softpipe_set_viewport_state;
diff --git a/src/mesa/pipe/softpipe/sp_context.h b/src/mesa/pipe/softpipe/sp_context.h
index 4cbb0f891e..f1bb3d39a6 100644
--- a/src/mesa/pipe/softpipe/sp_context.h
+++ b/src/mesa/pipe/softpipe/sp_context.h
@@ -47,7 +47,7 @@ struct draw_stage;
#define SP_NEW_VIEWPORT 0x1
-#define SP_NEW_SETUP 0x2
+#define SP_NEW_RASTERIZER 0x2
#define SP_NEW_FS 0x4
#define SP_NEW_BLEND 0x8
#define SP_NEW_CLIP 0x10
@@ -73,6 +73,7 @@ struct softpipe_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;
@@ -85,7 +86,6 @@ struct softpipe_context {
struct pipe_shader_state vs;
struct pipe_poly_stipple poly_stipple;
struct pipe_scissor_state scissor;
- struct pipe_setup_state setup;
struct pipe_mipmap_tree *texture[PIPE_MAX_SAMPLERS];
struct pipe_viewport_state viewport;
struct pipe_vertex_buffer vertex_buffer[PIPE_ATTRIB_MAX];
diff --git a/src/mesa/pipe/softpipe/sp_prim_setup.c b/src/mesa/pipe/softpipe/sp_prim_setup.c
index 83d317c36f..c64a4e9708 100644
--- a/src/mesa/pipe/softpipe/sp_prim_setup.c
+++ b/src/mesa/pipe/softpipe/sp_prim_setup.c
@@ -351,7 +351,7 @@ static boolean setup_sort_vertices( struct setup_stage *setup,
* - the GLSL gl_FrontFacing fragment attribute (bool)
* - two-sided stencil test
*/
- setup->quad.facing = (prim->det > 0.0) ^ (setup->softpipe->setup.front_winding == PIPE_WINDING_CW);
+ setup->quad.facing = (prim->det > 0.0) ^ (setup->softpipe->rasterizer->front_winding == PIPE_WINDING_CW);
return TRUE;
}
@@ -830,10 +830,10 @@ setup_line(struct draw_stage *stage, struct prim_header *prim)
const int errorDec = error - dx;
for (i = 0; i < dx; i++) {
- if (!sp->setup.line_stipple_enable ||
+ if (!sp->rasterizer->line_stipple_enable ||
stipple_test(sp->line_stipple_counter,
- sp->setup.line_stipple_pattern,
- sp->setup.line_stipple_factor + 1)) {
+ sp->rasterizer->line_stipple_pattern,
+ sp->rasterizer->line_stipple_factor + 1)) {
plot(setup, x0, y0);
}
@@ -857,10 +857,10 @@ setup_line(struct draw_stage *stage, struct prim_header *prim)
const int errorDec = error - dy;
for (i = 0; i < dy; i++) {
- if (!sp->setup.line_stipple_enable ||
+ if (!sp->rasterizer->line_stipple_enable ||
stipple_test(sp->line_stipple_counter,
- sp->setup.line_stipple_pattern,
- sp->setup.line_stipple_factor + 1)) {
+ sp->rasterizer->line_stipple_pattern,
+ sp->rasterizer->line_stipple_factor + 1)) {
plot(setup, x0, y0);
}
@@ -899,8 +899,8 @@ setup_point(struct draw_stage *stage, struct prim_header *prim)
const int sizeAttr = setup->lookup[TGSI_ATTRIB_POINTSIZE];
const float halfSize
= sizeAttr ? (0.5f * v0->data[sizeAttr][0])
- : (0.5f * setup->softpipe->setup.point_size);
- const boolean round = setup->softpipe->setup.point_smooth;
+ : (0.5f * setup->softpipe->rasterizer->point_size);
+ const boolean round = setup->softpipe->rasterizer->point_smooth;
const float x = v0->data[TGSI_ATTRIB_POS][0];
const float y = v0->data[TGSI_ATTRIB_POS][1];
unsigned slot, j;
diff --git a/src/mesa/pipe/softpipe/sp_quad.c b/src/mesa/pipe/softpipe/sp_quad.c
index 1f45776d47..fc4f8328cf 100644
--- a/src/mesa/pipe/softpipe/sp_quad.c
+++ b/src/mesa/pipe/softpipe/sp_quad.c
@@ -36,9 +36,9 @@ sp_build_quad_pipeline(struct softpipe_context *sp)
sp->quad.first = sp->quad.occlusion;
}
- if (sp->setup.poly_smooth ||
- sp->setup.line_smooth ||
- sp->setup.point_smooth) {
+ if (sp->rasterizer->poly_smooth ||
+ sp->rasterizer->line_smooth ||
+ sp->rasterizer->point_smooth) {
sp->quad.coverage->next = sp->quad.first;
sp->quad.first = sp->quad.coverage;
}
@@ -65,7 +65,7 @@ sp_build_quad_pipeline(struct softpipe_context *sp)
sp->quad.first = sp->quad.shade;
}
- if (sp->setup.poly_stipple_enable) {
+ if (sp->rasterizer->poly_stipple_enable) {
sp->quad.polygon_stipple->next = sp->quad.first;
sp->quad.first = sp->quad.polygon_stipple;
}
diff --git a/src/mesa/pipe/softpipe/sp_quad_coverage.c b/src/mesa/pipe/softpipe/sp_quad_coverage.c
index 8dfec59350..89f50bcca2 100644
--- a/src/mesa/pipe/softpipe/sp_quad_coverage.c
+++ b/src/mesa/pipe/softpipe/sp_quad_coverage.c
@@ -47,9 +47,9 @@ coverage_quad(struct quad_stage *qs, struct quad_header *quad)
{
struct softpipe_context *softpipe = qs->softpipe;
- if ((softpipe->setup.poly_smooth && quad->prim == PRIM_TRI) ||
- (softpipe->setup.line_smooth && quad->prim == PRIM_LINE) ||
- (softpipe->setup.point_smooth && quad->prim == PRIM_POINT)) {
+ if ((softpipe->rasterizer->poly_smooth && quad->prim == PRIM_TRI) ||
+ (softpipe->rasterizer->line_smooth && quad->prim == PRIM_LINE) ||
+ (softpipe->rasterizer->point_smooth && quad->prim == PRIM_POINT)) {
unsigned j;
for (j = 0; j < QUAD_SIZE; j++) {
assert(quad->coverage[j] >= 0.0);
diff --git a/src/mesa/pipe/softpipe/sp_state.h b/src/mesa/pipe/softpipe/sp_state.h
index caec3b4519..62bd26c4df 100644
--- a/src/mesa/pipe/softpipe/sp_state.h
+++ b/src/mesa/pipe/softpipe/sp_state.h
@@ -50,7 +50,6 @@ void softpipe_bind_sampler_state(struct pipe_context *,
void softpipe_delete_sampler_state(struct pipe_context *,
const struct pipe_sampler_state *);
-
const struct pipe_depth_stencil_state *
softpipe_create_depth_stencil_state(struct pipe_context *,
const struct pipe_depth_stencil_state *);
@@ -59,6 +58,14 @@ void softpipe_bind_depth_stencil_state(struct pipe_context *,
void softpipe_delete_depth_stencil_state(struct pipe_context *,
const struct pipe_depth_stencil_state *);
+const struct pipe_rasterizer_state *
+softpipe_create_rasterizer_state(struct pipe_context *,
+ const struct pipe_rasterizer_state *);
+void softpipe_bind_rasterizer_state(struct pipe_context *,
+ const struct pipe_rasterizer_state *);
+void softpipe_delete_rasterizer_state(struct pipe_context *,
+ const struct pipe_rasterizer_state *);
+
void softpipe_set_framebuffer_state( struct pipe_context *,
const struct pipe_framebuffer_state * );
@@ -93,9 +100,6 @@ void softpipe_set_polygon_stipple( struct pipe_context *,
void softpipe_set_scissor_state( struct pipe_context *,
const struct pipe_scissor_state * );
-void softpipe_set_setup_state( struct pipe_context *,
- const struct pipe_setup_state * );
-
void softpipe_set_texture_state( struct pipe_context *,
unsigned unit,
struct pipe_mipmap_tree * );
diff --git a/src/mesa/pipe/softpipe/sp_state_derived.c b/src/mesa/pipe/softpipe/sp_state_derived.c
index 47743e185c..8c6bacf65c 100644
--- a/src/mesa/pipe/softpipe/sp_state_derived.c
+++ b/src/mesa/pipe/softpipe/sp_state_derived.c
@@ -45,7 +45,7 @@ static void calculate_vertex_layout( struct softpipe_context *softpipe )
{
const uint inputsRead = softpipe->fs.inputs_read;
const interp_mode colorInterp
- = softpipe->setup.flatshade ? INTERP_CONSTANT : INTERP_LINEAR;
+ = softpipe->rasterizer->flatshade ? INTERP_CONSTANT : INTERP_LINEAR;
struct vertex_info *vinfo = &softpipe->vertex_info;
uint front0 = 0, back0 = 0, front1 = 0, back1 = 0;
uint i;
@@ -112,7 +112,7 @@ static void calculate_vertex_layout( struct softpipe_context *softpipe )
* lighting. Edgeflag is dealt with specially by setting bits in
* the vertex header.
*/
- if (softpipe->setup.light_twoside) {
+ if (softpipe->rasterizer->light_twoside) {
if (inputsRead & (1 << TGSI_ATTRIB_COLOR0)) {
back0 = draw_emit_vertex_attr(vinfo, TGSI_ATTRIB_BFC0,
FORMAT_OMIT, colorInterp);
@@ -160,7 +160,7 @@ compute_cliprect(struct softpipe_context *sp)
surfHeight = sp->scissor.maxy;
}
- if (sp->setup.scissor) {
+ if (sp->rasterizer->scissor) {
/* clip to scissor rect */
sp->cliprect.minx = MAX2(sp->scissor.minx, 0);
sp->cliprect.miny = MAX2(sp->scissor.miny, 0);
@@ -182,7 +182,7 @@ compute_cliprect(struct softpipe_context *sp)
*/
void softpipe_update_derived( struct softpipe_context *softpipe )
{
- if (softpipe->dirty & (SP_NEW_SETUP | SP_NEW_FS))
+ if (softpipe->dirty & (SP_NEW_RASTERIZER | SP_NEW_FS))
calculate_vertex_layout( softpipe );
if (softpipe->dirty & (SP_NEW_SCISSOR |
@@ -194,7 +194,7 @@ void softpipe_update_derived( struct softpipe_context *softpipe )
SP_NEW_DEPTH_STENCIL |
SP_NEW_ALPHA_TEST |
SP_NEW_FRAMEBUFFER |
- SP_NEW_SETUP |
+ SP_NEW_RASTERIZER |
SP_NEW_FS))
sp_build_quad_pipeline(softpipe);
diff --git a/src/mesa/pipe/softpipe/sp_state_setup.c b/src/mesa/pipe/softpipe/sp_state_setup.c
index 4715a26f55..6788396355 100644
--- a/src/mesa/pipe/softpipe/sp_state_setup.c
+++ b/src/mesa/pipe/softpipe/sp_state_setup.c
@@ -31,17 +31,35 @@
#include "pipe/draw/draw_context.h"
-void softpipe_set_setup_state( struct pipe_context *pipe,
- const struct pipe_setup_state *setup )
+
+const struct pipe_rasterizer_state *
+softpipe_create_rasterizer_state(struct pipe_context *pipe,
+ const struct pipe_rasterizer_state *setup)
+{
+ struct pipe_rasterizer_state *raster =
+ malloc(sizeof(struct pipe_rasterizer_state));
+ memcpy(raster, setup, sizeof(struct pipe_rasterizer_state));
+
+ return raster;
+}
+
+void softpipe_bind_rasterizer_state(struct pipe_context *pipe,
+ const struct pipe_rasterizer_state *setup)
{
struct softpipe_context *softpipe = softpipe_context(pipe);
/* pass-through to draw module */
draw_set_setup_state(softpipe->draw, setup);
- memcpy( &softpipe->setup, setup, sizeof(*setup) );
+ softpipe->rasterizer = setup;
+
+ softpipe->dirty |= SP_NEW_RASTERIZER;
+}
- softpipe->dirty |= SP_NEW_SETUP;
+void softpipe_delete_rasterizer_state(struct pipe_context *pipe,
+ const struct pipe_rasterizer_state *rasterizer)
+{
+ free((struct pipe_rasterizer_state*)rasterizer);
}