summaryrefslogtreecommitdiffstats
path: root/src/gallium
diff options
context:
space:
mode:
authorCorbin Simpson <[email protected]>2009-01-24 01:32:14 -0800
committerCorbin Simpson <[email protected]>2009-02-01 23:30:27 -0800
commit1a503019d73701ed311b15107f314bc84968bdb7 (patch)
tree9500018adab833e95c6d09d5bf62c386fbc11b78 /src/gallium
parent1a5eea0c1e9ce6162ed6b07c337bffe62cb3c221 (diff)
r300: Moar state handlers.
Ah, my code's so bad. It's amazing.
Diffstat (limited to 'src/gallium')
-rw-r--r--src/gallium/drivers/r300/r300_chipset.c3
-rw-r--r--src/gallium/drivers/r300/r300_context.h9
-rw-r--r--src/gallium/drivers/r300/r300_state.c76
3 files changed, 88 insertions, 0 deletions
diff --git a/src/gallium/drivers/r300/r300_chipset.c b/src/gallium/drivers/r300/r300_chipset.c
index f2dc8aedaad..494c9e54c02 100644
--- a/src/gallium/drivers/r300/r300_chipset.c
+++ b/src/gallium/drivers/r300/r300_chipset.c
@@ -340,4 +340,7 @@ void r300_parse_chipset(struct r300_capabilities* caps)
/* XXX not an r300?! */
break;
}
+
+ /* Force off TCL for now */
+ caps->has_tcl = FALSE;
}
diff --git a/src/gallium/drivers/r300/r300_context.h b/src/gallium/drivers/r300/r300_context.h
index 0d7ba581cc9..52ddfa1df95 100644
--- a/src/gallium/drivers/r300/r300_context.h
+++ b/src/gallium/drivers/r300/r300_context.h
@@ -79,6 +79,9 @@ struct r300_scissor_state {
uint32_t scissor_bottom_right; /* R300_SC_SCISSORS_BR: 0x43e4 */
};
+struct r300_texture_state {
+};
+
#define R300_NEW_BLEND 0x0001
#define R300_NEW_BLEND_COLOR 0x0002
#define R300_NEW_DSA 0x0004
@@ -121,6 +124,8 @@ struct r300_context {
struct r300_dsa_state* dsa_state;
/* Fragment shader state. */
struct r300_fs_state* fs_state;
+ /* Framebuffer state. We currently don't need our own version of this. */
+ struct pipe_framebuffer_state framebuffer_state;
/* Rasterizer state. */
struct r300_rs_state* rs_state;
/* Sampler states. */
@@ -128,6 +133,10 @@ struct r300_context {
int sampler_count;
/* Scissor state. */
struct r300_scissor_state* scissor_state;
+ /* Texture states. */
+ struct r300_texture* textures[8];
+ struct r300_texture_state* texture_states[8];
+ int texture_count;
/* Bitmask of dirty state objects. */
uint32_t dirty_state;
/* Flag indicating whether or not the HW is dirty. */
diff --git a/src/gallium/drivers/r300/r300_state.c b/src/gallium/drivers/r300/r300_state.c
index 9d9a4ec2020..4f9d44bbfd7 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;