summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/r300/r300_state.c
diff options
context:
space:
mode:
authorCorbin Simpson <MostAwesomeDude@gmail.com>2009-01-24 01:32:14 -0800
committerCorbin Simpson <MostAwesomeDude@gmail.com>2009-02-01 23:30:27 -0800
commit1a503019d73701ed311b15107f314bc84968bdb7 (patch)
tree9500018adab833e95c6d09d5bf62c386fbc11b78 /src/gallium/drivers/r300/r300_state.c
parent1a5eea0c1e9ce6162ed6b07c337bffe62cb3c221 (diff)
r300: Moar state handlers.
Ah, my code's so bad. It's amazing.
Diffstat (limited to 'src/gallium/drivers/r300/r300_state.c')
-rw-r--r--src/gallium/drivers/r300/r300_state.c76
1 files changed, 76 insertions, 0 deletions
diff --git a/src/gallium/drivers/r300/r300_state.c b/src/gallium/drivers/r300/r300_state.c
index 9d9a4ec202..4f9d44bbfd 100644
--- a/src/gallium/drivers/r300/r300_state.c
+++ b/src/gallium/drivers/r300/r300_state.c
@@ -195,6 +195,15 @@ static void r300_set_blend_color(struct pipe_context* pipe,
r300->dirty_state |= R300_NEW_BLEND_COLOR;
}
+static void r300_set_clip_state(struct pipe_context* pipe,
+ const struct pipe_clip_state* state)
+{
+ struct r300_context* r300 = r300_context(pipe);
+ /* XXX Draw */
+ draw_flush(r300->draw);
+ draw_set_clip_state(r300->draw, state);
+}
+
static uint32_t translate_depth_stencil_function(int zs_func) {
switch (zs_func) {
case PIPE_FUNC_NEVER:
@@ -358,6 +367,19 @@ static void r300_delete_dsa_state(struct pipe_context* pipe,
FREE(state);
}
+static void
+ r300_set_framebuffer_state(struct pipe_context* pipe,
+ const struct pipe_framebuffer_state* state)
+{
+ struct r300_context* r300 = r300_context(pipe);
+
+ draw_flush(r300->draw);
+
+ r300->framebuffer_state = *state;
+
+ /* XXX do we need to mark dirty state? */
+}
+
/* Create fragment shader state. */
static void* r300_create_fs_state(struct pipe_context* pipe,
const struct pipe_shader_state* state)
@@ -383,6 +405,12 @@ static void r300_delete_fs_state(struct pipe_context* pipe, void* state)
FREE(state);
}
+static void r300_set_polygon_stipple(struct pipe_context* pipe,
+ const struct pipe_poly_stipple* state)
+{
+ /* XXX */
+}
+
#if 0
struct pipe_rasterizer_state
{
@@ -621,6 +649,36 @@ static void r300_delete_sampler_state(struct pipe_context* pipe, void* state)
FREE(state);
}
+static void r300_set_sampler_textures(struct pipe_context* pipe,
+ unsigned count,
+ struct pipe_texture** texture)
+{
+ struct r300_context* r300 = r300_context(pipe);
+ int i;
+
+ /* XXX magic num */
+ if (count > 8) {
+ return;
+ }
+
+ for (i = 0; i < count; i++) {
+ if (r300->textures[i] != (struct r300_texture*)texture[i]) {
+ pipe_texture_reference((struct pipe_texture**)&r300->textures[i],
+ texture[i]);
+ /* XXX NEW_TEXTURE instead? */
+ r300->dirty_state |= (R300_NEW_SAMPLER << i);
+ }
+ }
+
+ for (i = count; i < 8; i++) {
+ /* XXX also state change? */
+ pipe_texture_reference((struct pipe_texture**)&r300->textures[i],
+ NULL);
+ }
+
+ r300->texture_count = count;
+}
+
static void r300_set_scissor_state(struct pipe_context* pipe,
const struct pipe_scissor_state* state)
{
@@ -645,6 +703,14 @@ static void r300_set_scissor_state(struct pipe_context* pipe,
r300->dirty_state |= R300_NEW_SCISSOR;
}
+static void r300_set_viewport_state(struct pipe_context* pipe,
+ const struct pipe_viewport_state* state)
+{
+ struct r300_context* r300 = r300_context(pipe);
+ /* XXX handing this off to Draw for now */
+ draw_set_viewport_state(r300->draw, state);
+}
+
static void* r300_create_vs_state(struct pipe_context* pipe,
const struct pipe_shader_state* state)
{
@@ -674,14 +740,20 @@ void r300_init_state_functions(struct r300_context* r300) {
r300->context.set_blend_color = r300_set_blend_color;
+ r300->context.set_clip_state = r300_set_clip_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_framebuffer_state = r300_set_framebuffer_state;
+
r300->context.create_fs_state = r300_create_fs_state;
r300->context.bind_fs_state = r300_bind_fs_state;
r300->context.delete_fs_state = r300_delete_fs_state;
+ r300->context.set_polygon_stipple = r300_set_polygon_stipple;
+
r300->context.create_rasterizer_state = r300_create_rs_state;
r300->context.bind_rasterizer_state = r300_bind_rs_state;
r300->context.delete_rasterizer_state = r300_delete_rs_state;
@@ -690,8 +762,12 @@ void r300_init_state_functions(struct r300_context* r300) {
r300->context.bind_sampler_states = r300_bind_sampler_states;
r300->context.delete_sampler_state = r300_delete_sampler_state;
+ r300->context.set_sampler_textures = r300_set_sampler_textures;
+
r300->context.set_scissor_state = r300_set_scissor_state;
+ r300->context.set_viewport_state = r300_set_viewport_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;