summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/r300/r300_state.c
diff options
context:
space:
mode:
authorCorbin Simpson <[email protected]>2009-01-14 05:00:22 -0800
committerCorbin Simpson <[email protected]>2009-02-01 23:30:23 -0800
commit21a5a133fff3ab1a068a11a32144dcb63f1d5020 (patch)
treedb49d36d680c799d849f4589d99cac3466b0eaa5 /src/gallium/drivers/r300/r300_state.c
parentbbb1c6f6298fcb1125a8170f22646f326b0ca74c (diff)
r300: Hook up state functions.
Haha, should not have attempted the scissors.
Diffstat (limited to 'src/gallium/drivers/r300/r300_state.c')
-rw-r--r--src/gallium/drivers/r300/r300_state.c60
1 files changed, 23 insertions, 37 deletions
diff --git a/src/gallium/drivers/r300/r300_state.c b/src/gallium/drivers/r300/r300_state.c
index 0f0660c4030..122e06c6e6a 100644
--- a/src/gallium/drivers/r300/r300_state.c
+++ b/src/gallium/drivers/r300/r300_state.c
@@ -92,7 +92,7 @@ static uint32_t translate_blend_factor(int blend_fact) {
*
* This encompasses alpha blending, logic/raster ops, and blend dithering. */
static void* r300_create_blend_state(struct pipe_context* pipe,
- struct pipe_blend_state* state)
+ const struct pipe_blend_state* state)
{
struct r300_blend_state* blend = CALLOC_STRUCT(r300_blend_state);
@@ -310,48 +310,17 @@ static void r300_delete_dsa_state(struct pipe_context* pipe,
FREE(state);
}
-/* Create a new scissor state based on the CSO scissor state.
- *
- * This is only for the fragment scissors. */
-static void* r300_create_scissor_state(struct pipe_context* pipe,
- struct pipe_scissor_state* state)
-{
- uint32_t left, top, right, bottom;
- struct r300_scissor_state* scissor = CALLOC_STRUCT(r300_scissor_state);
-
- /* So, a bit of info. The scissors are offset by R300_SCISSORS_OFFSET in
- * both directions for all values, and can only be 13 bits wide. Why?
- * We may never know. */
- left = (state->minx + R300_SCISSORS_OFFSET) & 0x1fff;
- top = (state->miny + R300_SCISSORS_OFFSET) & 0x1fff;
- right = (state->maxx + R300_SCISSORS_OFFSET) & 0x1fff;
- bottom = (state->maxy + R300_SCISSORS_OFFSET) & 0x1fff;
-
- scissor->scissor_top_left = (left << R300_SCISSORS_X_SHIFT) |
- (top << R300_SCISSORS_Y_SHIFT);
- scissor->scissor_bottom_right = (right << R300_SCISSORS_X_SHIFT) |
- (bottom << R300_SCISSORS_Y_SHIFT);
-
- return (void*)scissor;
-}
-
-/* Bind scissor state.*/
-static void r300_bind_scissor_state(struct pipe_context* pipe,
- void* state)
+static void r300_set_scissor_state(struct pipe_context* pipe,
+ struct pipe_scissor_state* state)
{
struct r300_context* r300 = r300_context(pipe);
+ draw_flush(r300->draw);
- r300->scissor_state = (struct r300_scissor_state*)state;
+ /* XXX figure out how this memory doesn't get lost in space
+ memcpy(r300->scissor, scissor, sizeof(struct pipe_scissor_state)); */
r300->dirty_state |= R300_NEW_SCISSOR;
}
-/* Delete scissor state. */
-static void r300_delete_scissor_state(struct pipe_context* pipe,
- void* state)
-{
- FREE(state);
-}
-
static void* r300_create_vs_state(struct pipe_context* pipe,
struct pipe_shader_state* state)
{
@@ -371,4 +340,21 @@ static void r300_delete_vs_state(struct pipe_context* pipe, void* state)
struct r300_context* context = r300_context(pipe);
/* XXX handing this off to Draw for now */
draw_delete_vertex_shader(context->draw, (struct draw_vertex_shader*)state);
+}
+
+void r300_init_state_functions(struct r300_context* r300) {
+
+ r300->context.create_blend_state = r300_create_blend_state;
+ r300->context.bind_blend_state = r300_bind_blend_state;
+ r300->context.delete_blend_state = r300_delete_blend_state;
+
+ r300->context.create_depth_stencil_alpha_state = r300_create_dsa_state;
+ r300->context.bind_depth_stencil_alpha_state = r300_bind_dsa_state;
+ r300->context.delete_depth_stencil_alpha_state = r300_delete_dsa_state;
+
+ r300->context.set_scissor_state = r300_set_scissor_state;
+
+ r300->context.create_vs_state = r300_create_vs_state;
+ r300->context.bind_vs_state = r300_bind_vs_state;
+ r300->context.delete_vs_state = r300_delete_vs_state;
} \ No newline at end of file