r300g: Start using atoms.
No benefits yet.
This commit is contained in:
@@ -27,7 +27,7 @@
|
||||
|
||||
static void r300_blitter_save_states(struct r300_context* r300)
|
||||
{
|
||||
util_blitter_save_blend(r300->blitter, r300->blend_state);
|
||||
util_blitter_save_blend(r300->blitter, r300->blend_state.state);
|
||||
util_blitter_save_depth_stencil_alpha(r300->blitter, r300->dsa_state);
|
||||
util_blitter_save_rasterizer(r300->blitter, r300->rs_state);
|
||||
util_blitter_save_fragment_shader(r300->blitter, r300->fs);
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
|
||||
#include "r300_blit.h"
|
||||
#include "r300_context.h"
|
||||
#include "r300_emit.h"
|
||||
#include "r300_flush.h"
|
||||
#include "r300_query.h"
|
||||
#include "r300_render.h"
|
||||
@@ -107,6 +108,18 @@ static void r300_flush_cb(void *data)
|
||||
cs_context_copy->context.flush(&cs_context_copy->context, 0, NULL);
|
||||
}
|
||||
|
||||
#define R300_INIT_ATOM(name) \
|
||||
r300->name##_state.state = NULL; \
|
||||
r300->name##_state.emit = r300_emit_##name##_state; \
|
||||
r300->name##_state.dirty = FALSE; \
|
||||
insert_at_tail(&r300->atom_list, &r300->name##_state);
|
||||
|
||||
static void r300_setup_atoms(struct r300_context* r300)
|
||||
{
|
||||
make_empty_list(&r300->atom_list);
|
||||
R300_INIT_ATOM(blend);
|
||||
}
|
||||
|
||||
struct pipe_context* r300_create_context(struct pipe_screen* screen,
|
||||
struct radeon_winsys* radeon_winsys)
|
||||
{
|
||||
@@ -166,6 +179,8 @@ struct pipe_context* r300_create_context(struct pipe_screen* screen,
|
||||
PIPE_BUFFER_USAGE_VERTEX, 4096);
|
||||
make_empty_list(&r300->query_list);
|
||||
|
||||
r300_setup_atoms(r300);
|
||||
|
||||
r300_init_flush_functions(r300);
|
||||
|
||||
r300_init_query_functions(r300);
|
||||
|
||||
@@ -30,9 +30,18 @@
|
||||
#include "pipe/p_context.h"
|
||||
#include "pipe/p_inlines.h"
|
||||
|
||||
struct r300_context;
|
||||
|
||||
struct r300_fragment_shader;
|
||||
struct r300_vertex_shader;
|
||||
|
||||
struct r300_atom {
|
||||
struct r300_atom *prev, *next;
|
||||
void* state;
|
||||
void (*emit)(struct r300_context*, void*);
|
||||
boolean dirty;
|
||||
};
|
||||
|
||||
struct r300_blend_state {
|
||||
uint32_t blend_control; /* R300_RB3D_CBLEND: 0x4e04 */
|
||||
uint32_t alpha_blend_control; /* R300_RB3D_ABLEND: 0x4e08 */
|
||||
@@ -135,7 +144,6 @@ struct r300_ztop_state {
|
||||
uint32_t z_buffer_top; /* R300_ZB_ZTOP: 0x4f14 */
|
||||
};
|
||||
|
||||
#define R300_NEW_BLEND 0x00000001
|
||||
#define R300_NEW_BLEND_COLOR 0x00000002
|
||||
#define R300_NEW_CLIP 0x00000004
|
||||
#define R300_NEW_DSA 0x00000008
|
||||
@@ -273,8 +281,10 @@ struct r300_context {
|
||||
struct r300_vertex_info* vertex_info;
|
||||
|
||||
/* Various CSO state objects. */
|
||||
/* Beginning of atom list. */
|
||||
struct r300_atom atom_list;
|
||||
/* Blend state. */
|
||||
struct r300_blend_state* blend_state;
|
||||
struct r300_atom blend_state;
|
||||
/* Blend color state. */
|
||||
struct r300_blend_color_state* blend_color_state;
|
||||
/* User clip planes. */
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
|
||||
#include "util/u_format.h"
|
||||
#include "util/u_math.h"
|
||||
#include "util/u_simple_list.h"
|
||||
|
||||
#include "r300_context.h"
|
||||
#include "r300_cs.h"
|
||||
@@ -36,9 +37,9 @@
|
||||
#include "r300_texture.h"
|
||||
#include "r300_vs.h"
|
||||
|
||||
void r300_emit_blend_state(struct r300_context* r300,
|
||||
struct r300_blend_state* blend)
|
||||
void r300_emit_blend_state(struct r300_context* r300, void* state)
|
||||
{
|
||||
struct r300_blend_state* blend = (struct r300_blend_state*)state;
|
||||
CS_LOCALS(r300);
|
||||
BEGIN_CS(8);
|
||||
OUT_CS_REG_SEQ(R300_RB3D_CBLEND, 3);
|
||||
@@ -978,6 +979,7 @@ void r300_emit_dirty_state(struct r300_context* r300)
|
||||
{
|
||||
struct r300_screen* r300screen = r300_screen(r300->context.screen);
|
||||
struct r300_texture* tex;
|
||||
struct r300_atom* atom;
|
||||
int i, dirty_tex = 0;
|
||||
boolean invalid = FALSE;
|
||||
|
||||
@@ -1060,9 +1062,11 @@ validate:
|
||||
r300->dirty_state &= ~R300_NEW_QUERY;
|
||||
}
|
||||
|
||||
if (r300->dirty_state & R300_NEW_BLEND) {
|
||||
r300_emit_blend_state(r300, r300->blend_state);
|
||||
r300->dirty_state &= ~R300_NEW_BLEND;
|
||||
foreach(atom, &r300->atom_list) {
|
||||
if (atom->dirty) {
|
||||
atom->emit(r300, atom->state);
|
||||
atom->dirty = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
if (r300->dirty_state & R300_NEW_BLEND_COLOR) {
|
||||
|
||||
@@ -32,7 +32,7 @@ struct r300_vertex_program_code;
|
||||
void r300_emit_aos(struct r300_context* r300, unsigned offset);
|
||||
|
||||
void r300_emit_blend_state(struct r300_context* r300,
|
||||
struct r300_blend_state* blend);
|
||||
void* blend);
|
||||
|
||||
void r300_emit_blend_color_state(struct r300_context* r300,
|
||||
struct r300_blend_color_state* bc);
|
||||
|
||||
@@ -317,8 +317,8 @@ static void r300_bind_blend_state(struct pipe_context* pipe,
|
||||
{
|
||||
struct r300_context* r300 = r300_context(pipe);
|
||||
|
||||
r300->blend_state = (struct r300_blend_state*)state;
|
||||
r300->dirty_state |= R300_NEW_BLEND;
|
||||
r300->blend_state.state = state;
|
||||
r300->blend_state.dirty = TRUE;
|
||||
}
|
||||
|
||||
/* Free blend state. */
|
||||
@@ -521,8 +521,9 @@ static void
|
||||
r300->dirty_state |= R300_NEW_SCISSOR;
|
||||
}
|
||||
r300->dirty_state |= R300_NEW_FRAMEBUFFERS;
|
||||
r300->dirty_state |= R300_NEW_BLEND;
|
||||
r300->dirty_state |= R300_NEW_DSA;
|
||||
|
||||
r300->blend_state.dirty = TRUE;
|
||||
}
|
||||
|
||||
/* Create fragment shader state. */
|
||||
|
||||
Reference in New Issue
Block a user