@@ -98,6 +98,8 @@ static void r300_hw_copy(struct pipe_context* pipe, | |||
unsigned width, unsigned height) | |||
{ | |||
struct r300_context* r300 = r300_context(pipe); | |||
struct r300_textures_state* state = | |||
(struct r300_textures_state*)r300->textures_state.state; | |||
/* Yeah we have to save all those states to ensure this blitter operation | |||
* is really transparent. The states will be restored by the blitter once | |||
@@ -106,11 +108,11 @@ static void r300_hw_copy(struct pipe_context* pipe, | |||
util_blitter_save_framebuffer(r300->blitter, r300->fb_state.state); | |||
util_blitter_save_fragment_sampler_states( | |||
r300->blitter, r300->sampler_count, (void**)r300->sampler_states); | |||
r300->blitter, state->sampler_count, (void**)state->sampler_states); | |||
util_blitter_save_fragment_sampler_textures( | |||
r300->blitter, r300->texture_count, | |||
(struct pipe_texture**)r300->textures); | |||
r300->blitter, state->texture_count, | |||
(struct pipe_texture**)state->textures); | |||
/* Do a copy */ | |||
util_blitter_copy(r300->blitter, |
@@ -59,6 +59,7 @@ static void r300_destroy_context(struct pipe_context* context) | |||
FREE(r300->fb_state.state); | |||
FREE(r300->rs_block_state.state); | |||
FREE(r300->scissor_state.state); | |||
FREE(r300->textures_state.state); | |||
FREE(r300->vertex_stream_state.state); | |||
FREE(r300->vap_output_state.state); | |||
FREE(r300->viewport_state.state); | |||
@@ -133,6 +134,7 @@ static void r300_setup_atoms(struct r300_context* r300) | |||
R300_INIT_ATOM(pvs_flush, 2); | |||
R300_INIT_ATOM(vs_state, 0); | |||
R300_INIT_ATOM(texture_cache_inval, 2); | |||
R300_INIT_ATOM(textures_state, 0); | |||
/* Some non-CSO atoms need explicit space to store the state locally. */ | |||
r300->blend_color_state.state = CALLOC_STRUCT(r300_blend_color_state); | |||
@@ -140,6 +142,7 @@ static void r300_setup_atoms(struct r300_context* r300) | |||
r300->fb_state.state = CALLOC_STRUCT(pipe_framebuffer_state); | |||
r300->rs_block_state.state = CALLOC_STRUCT(r300_rs_block); | |||
r300->scissor_state.state = CALLOC_STRUCT(pipe_scissor_state); | |||
r300->textures_state.state = CALLOC_STRUCT(r300_textures_state); | |||
r300->vertex_stream_state.state = CALLOC_STRUCT(r300_vertex_stream_state); | |||
r300->vap_output_state.state = CALLOC_STRUCT(r300_vap_output_state); | |||
r300->viewport_state.state = CALLOC_STRUCT(r300_viewport_state); |
@@ -118,7 +118,7 @@ struct r300_sampler_state { | |||
unsigned min_lod, max_lod; | |||
}; | |||
struct r300_texture_state { | |||
struct r300_texture_format_state { | |||
uint32_t format0; /* R300_TX_FORMAT0: 0x4480 */ | |||
uint32_t format1; /* R300_TX_FORMAT1: 0x44c0 */ | |||
uint32_t format2; /* R300_TX_FORMAT2: 0x4500 */ | |||
@@ -134,6 +134,25 @@ struct r300_texture_fb_state { | |||
uint32_t zb_format; /* R300_ZB_FORMAT */ | |||
}; | |||
struct r300_textures_state { | |||
/* Textures. */ | |||
struct r300_texture *textures[8]; | |||
int texture_count; | |||
/* Sampler states. */ | |||
struct r300_sampler_state *sampler_states[8]; | |||
int sampler_count; | |||
/* These is the merge of the texture and sampler states. */ | |||
unsigned count; | |||
uint32_t tx_enable; /* R300_TX_ENABLE: 0x4101 */ | |||
struct r300_texture_sampler_state { | |||
uint32_t format[3]; /* R300_TX_FORMAT[0-2] */ | |||
uint32_t filter[2]; /* R300_TX_FILTER[0-1] */ | |||
uint32_t border_color; /* R300_TX_BORDER_COLOR: 0x45c0 */ | |||
uint32_t tile_config; /* R300_TX_OFFSET (subset thereof) */ | |||
} regs[8]; | |||
}; | |||
struct r300_vertex_stream_state { | |||
/* R300_VAP_PROG_STREAK_CNTL_[0-7] */ | |||
uint32_t vap_prog_stream_cntl[8]; | |||
@@ -165,10 +184,6 @@ struct r300_ztop_state { | |||
#define R300_NEW_FRAGMENT_SHADER 0x00000020 | |||
#define R300_NEW_FRAGMENT_SHADER_CONSTANTS 0x00000040 | |||
#define R300_NEW_SAMPLER 0x00000200 | |||
#define R300_ANY_NEW_SAMPLERS 0x0001fe00 | |||
#define R300_NEW_TEXTURE 0x00040000 | |||
#define R300_ANY_NEW_TEXTURES 0x03fc0000 | |||
#define R300_NEW_VERTEX_SHADER_CONSTANTS 0x10000000 | |||
#define R300_NEW_QUERY 0x40000000 | |||
#define R300_NEW_KITCHEN_SINK 0x7fffffff | |||
@@ -254,7 +269,7 @@ struct r300_texture { | |||
struct pipe_buffer* buffer; | |||
/* Registers carrying texture format data. */ | |||
struct r300_texture_state state; | |||
struct r300_texture_format_state state; | |||
struct r300_texture_fb_state fb_state; | |||
/* Buffer tiling */ | |||
@@ -306,14 +321,10 @@ struct r300_context { | |||
struct r300_atom rs_state; | |||
/* RS block state. */ | |||
struct r300_atom rs_block_state; | |||
/* Sampler states. */ | |||
struct r300_sampler_state* sampler_states[8]; | |||
int sampler_count; | |||
/* Scissor state. */ | |||
struct r300_atom scissor_state; | |||
/* Texture states. */ | |||
struct r300_texture* textures[8]; | |||
int texture_count; | |||
/* Textures state. */ | |||
struct r300_atom textures_state; | |||
/* Vertex stream formatting state. */ | |||
struct r300_atom vertex_stream_state; | |||
/* VAP (vertex shader) output mapping state. */ |
@@ -146,6 +146,8 @@ static const float * get_shader_constant( | |||
{ | |||
struct r300_viewport_state* viewport = | |||
(struct r300_viewport_state*)r300->viewport_state.state; | |||
struct r300_textures_state* texstate = | |||
(struct r300_textures_state*)r300->textures_state.state; | |||
static float vec[4] = { 0.0, 0.0, 0.0, 1.0 }; | |||
struct pipe_texture *tex; | |||
@@ -161,7 +163,7 @@ static const float * get_shader_constant( | |||
/* Factor for converting rectangle coords to | |||
* normalized coords. Should only show up on non-r500. */ | |||
case RC_STATE_R300_TEXRECT_FACTOR: | |||
tex = &r300->textures[constant->u.State[1]]->tex; | |||
tex = &texstate->textures[constant->u.State[1]]->tex; | |||
vec[0] = 1.0 / tex->width0; | |||
vec[1] = 1.0 / tex->height0; | |||
break; | |||
@@ -728,49 +730,35 @@ void r300_emit_scissor_state(struct r300_context* r300, | |||
END_CS; | |||
} | |||
void r300_emit_texture(struct r300_context* r300, | |||
struct r300_sampler_state* sampler, | |||
struct r300_texture* tex, | |||
unsigned offset) | |||
void r300_emit_textures_state(struct r300_context *r300, | |||
unsigned size, void *state) | |||
{ | |||
uint32_t filter0 = sampler->filter0; | |||
uint32_t format0 = tex->state.format0; | |||
unsigned min_level, max_level; | |||
struct r300_textures_state *allstate = (struct r300_textures_state*)state; | |||
struct r300_texture_sampler_state *texstate; | |||
unsigned i; | |||
CS_LOCALS(r300); | |||
/* to emulate 1D textures through 2D ones correctly */ | |||
if (tex->tex.target == PIPE_TEXTURE_1D) { | |||
filter0 &= ~R300_TX_WRAP_T_MASK; | |||
filter0 |= R300_TX_WRAP_T(R300_TX_CLAMP_TO_EDGE); | |||
} | |||
BEGIN_CS(size); | |||
OUT_CS_REG(R300_TX_ENABLE, allstate->tx_enable); | |||
if (tex->is_npot) { | |||
/* NPOT textures don't support mip filter, unfortunately. | |||
* This prevents incorrect rendering. */ | |||
filter0 &= ~R300_TX_MIN_FILTER_MIP_MASK; | |||
} else { | |||
/* determine min/max levels */ | |||
/* the MAX_MIP level is the largest (finest) one */ | |||
max_level = MIN2(sampler->max_lod, tex->tex.last_level); | |||
min_level = MIN2(sampler->min_lod, max_level); | |||
format0 |= R300_TX_NUM_LEVELS(max_level); | |||
filter0 |= R300_TX_MAX_MIP_LEVEL(min_level); | |||
} | |||
for (i = 0; i < allstate->count; i++) { | |||
if ((1 << i) & allstate->tx_enable) { | |||
texstate = &allstate->regs[i]; | |||
OUT_CS_REG(R300_TX_FILTER0_0 + (i * 4), texstate->filter[0]); | |||
OUT_CS_REG(R300_TX_FILTER1_0 + (i * 4), texstate->filter[1]); | |||
OUT_CS_REG(R300_TX_BORDER_COLOR_0 + (i * 4), | |||
texstate->border_color); | |||
OUT_CS_REG(R300_TX_FORMAT0_0 + (i * 4), texstate->format[0]); | |||
OUT_CS_REG(R300_TX_FORMAT1_0 + (i * 4), texstate->format[1]); | |||
OUT_CS_REG(R300_TX_FORMAT2_0 + (i * 4), texstate->format[2]); | |||
BEGIN_CS(16); | |||
OUT_CS_REG(R300_TX_FILTER0_0 + (offset * 4), filter0 | | |||
(offset << 28)); | |||
OUT_CS_REG(R300_TX_FILTER1_0 + (offset * 4), sampler->filter1); | |||
OUT_CS_REG(R300_TX_BORDER_COLOR_0 + (offset * 4), sampler->border_color); | |||
OUT_CS_REG(R300_TX_FORMAT0_0 + (offset * 4), format0); | |||
OUT_CS_REG(R300_TX_FORMAT1_0 + (offset * 4), tex->state.format1); | |||
OUT_CS_REG(R300_TX_FORMAT2_0 + (offset * 4), tex->state.format2); | |||
OUT_CS_REG_SEQ(R300_TX_OFFSET_0 + (offset * 4), 1); | |||
OUT_CS_RELOC(tex->buffer, | |||
R300_TXO_MACRO_TILE(tex->macrotile) | | |||
R300_TXO_MICRO_TILE(tex->microtile), | |||
RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0, 0); | |||
OUT_CS_REG_SEQ(R300_TX_OFFSET_0 + (i * 4), 1); | |||
OUT_CS_RELOC(allstate->textures[i]->buffer, texstate->tile_config, | |||
RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0, 0); | |||
} | |||
} | |||
END_CS; | |||
} | |||
@@ -976,27 +964,6 @@ void r300_emit_viewport_state(struct r300_context* r300, | |||
} | |||
} | |||
void r300_emit_texture_count(struct r300_context* r300) | |||
{ | |||
uint32_t tx_enable = 0; | |||
int i; | |||
CS_LOCALS(r300); | |||
/* Notice that texture_count and sampler_count are just sizes | |||
* of the respective arrays. We still have to check for the individual | |||
* elements. */ | |||
for (i = 0; i < MIN2(r300->sampler_count, r300->texture_count); i++) { | |||
if (r300->textures[i]) { | |||
tx_enable |= 1 << i; | |||
} | |||
} | |||
BEGIN_CS(2); | |||
OUT_CS_REG(R300_TX_ENABLE, tx_enable); | |||
END_CS; | |||
} | |||
void r300_emit_ztop_state(struct r300_context* r300, | |||
unsigned size, void* state) | |||
{ | |||
@@ -1023,6 +990,8 @@ void r300_emit_buffer_validate(struct r300_context *r300, | |||
{ | |||
struct pipe_framebuffer_state* fb = | |||
(struct pipe_framebuffer_state*)r300->fb_state.state; | |||
struct r300_textures_state *texstate = | |||
(struct r300_textures_state*)r300->textures_state.state; | |||
struct r300_texture* tex; | |||
struct pipe_vertex_buffer *vbuf = r300->vertex_buffer; | |||
struct pipe_vertex_element *velem = r300->vertex_element; | |||
@@ -1055,9 +1024,9 @@ validate: | |||
} | |||
} | |||
/* ...textures... */ | |||
for (i = 0; i < r300->texture_count; i++) { | |||
tex = r300->textures[i]; | |||
if (!tex) | |||
for (i = 0; i < texstate->count; i++) { | |||
tex = texstate->textures[i]; | |||
if (!tex || !texstate->sampler_states[i]) | |||
continue; | |||
if (!r300->winsys->add_buffer(r300->winsys, tex->buffer, | |||
RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0)) { | |||
@@ -1136,7 +1105,6 @@ void r300_emit_dirty_state(struct r300_context* r300) | |||
{ | |||
struct r300_screen* r300screen = r300_screen(r300->context.screen); | |||
struct r300_atom* atom; | |||
unsigned i; | |||
if (r300->dirty_state & R300_NEW_QUERY) { | |||
r300_emit_query_start(r300); | |||
@@ -1171,27 +1139,6 @@ void r300_emit_dirty_state(struct r300_context* r300) | |||
r300->dirty_state &= ~R300_NEW_FRAGMENT_SHADER_CONSTANTS; | |||
} | |||
/* Samplers and textures are tracked separately but emitted together. */ | |||
if (r300->dirty_state & | |||
(R300_ANY_NEW_SAMPLERS | R300_ANY_NEW_TEXTURES)) { | |||
r300_emit_texture_count(r300); | |||
for (i = 0; i < MIN2(r300->sampler_count, r300->texture_count); i++) { | |||
if (r300->dirty_state & | |||
((R300_NEW_SAMPLER << i) | (R300_NEW_TEXTURE << i))) { | |||
if (r300->textures[i]) { | |||
r300_emit_texture(r300, | |||
r300->sampler_states[i], | |||
r300->textures[i], | |||
i); | |||
} | |||
r300->dirty_state &= | |||
~((R300_NEW_SAMPLER << i) | (R300_NEW_TEXTURE << i)); | |||
} | |||
} | |||
r300->dirty_state &= ~(R300_ANY_NEW_SAMPLERS | R300_ANY_NEW_TEXTURES); | |||
} | |||
if (r300->dirty_state & R300_NEW_VERTEX_SHADER_CONSTANTS) { | |||
struct r300_vertex_shader* vs = r300->vs_state.state; | |||
r300_emit_vs_constant_buffer(r300, &vs->code.constants); |
@@ -70,10 +70,8 @@ void r300_emit_rs_block_state(struct r300_context* r300, | |||
void r300_emit_scissor_state(struct r300_context* r300, | |||
unsigned size, void* state); | |||
void r300_emit_texture(struct r300_context* r300, | |||
struct r300_sampler_state* sampler, | |||
struct r300_texture* tex, | |||
unsigned offset); | |||
void r300_emit_textures_state(struct r300_context *r300, | |||
unsigned size, void *state); | |||
void r300_emit_vertex_buffer(struct r300_context* r300); | |||
@@ -83,9 +81,6 @@ void r300_emit_vertex_stream_state(struct r300_context* r300, | |||
void r300_emit_vap_output_state(struct r300_context* r300, | |||
unsigned size, void* state); | |||
void r300_emit_vertex_program_code(struct r300_context* r300, | |||
struct r300_vertex_program_code* code); | |||
void r300_emit_vs_constant_buffer(struct r300_context* r300, | |||
struct rc_constant_list* constants); | |||
@@ -94,8 +89,6 @@ void r300_emit_vs_state(struct r300_context* r300, unsigned size, void* state); | |||
void r300_emit_viewport_state(struct r300_context* r300, | |||
unsigned size, void* state); | |||
void r300_emit_texture_count(struct r300_context* r300); | |||
void r300_emit_ztop_state(struct r300_context* r300, | |||
unsigned size, void* state); | |||
@@ -133,10 +133,13 @@ static void get_compare_state( | |||
struct r300_fragment_program_external_state* state, | |||
unsigned shadow_samplers) | |||
{ | |||
struct r300_textures_state *texstate = | |||
(struct r300_textures_state*)r300->textures_state.state; | |||
memset(state, 0, sizeof(*state)); | |||
for (int i = 0; i < r300->sampler_count; i++) { | |||
struct r300_sampler_state* s = r300->sampler_states[i]; | |||
for (int i = 0; i < texstate->sampler_count; i++) { | |||
struct r300_sampler_state* s = texstate->sampler_states[i]; | |||
if (s && s->state.compare_mode == PIPE_TEX_COMPARE_R_TO_TEXTURE) { | |||
/* XXX Gallium doesn't provide us with any information regarding |
@@ -859,7 +859,7 @@ static void* | |||
state->max_anisotropy > 0); | |||
/* Unfortunately, r300-r500 don't support floating-point mipmap lods. */ | |||
/* We must pass these to the emit function to clamp them properly. */ | |||
/* We must pass these to the merge function to clamp them properly. */ | |||
sampler->min_lod = MAX2((unsigned)state->min_lod, 0); | |||
sampler->max_lod = MAX2((unsigned)ceilf(state->max_lod), 0); | |||
@@ -885,23 +885,20 @@ static void r300_bind_sampler_states(struct pipe_context* pipe, | |||
void** states) | |||
{ | |||
struct r300_context* r300 = r300_context(pipe); | |||
int i; | |||
struct r300_textures_state* state = | |||
(struct r300_textures_state*)r300->textures_state.state; | |||
if (count > 8) { | |||
return; | |||
} | |||
for (i = 0; i < count; i++) { | |||
if (r300->sampler_states[i] != states[i]) { | |||
r300->sampler_states[i] = (struct r300_sampler_state*)states[i]; | |||
r300->dirty_state |= (R300_NEW_SAMPLER << i); | |||
} | |||
} | |||
memcpy(state->sampler_states, states, sizeof(void*) * count); | |||
state->sampler_count = count; | |||
r300->sampler_count = count; | |||
r300->textures_state.dirty = TRUE; | |||
/* Pick a fragment shader based on the texture compare state. */ | |||
if (r300->fs && (r300->dirty_state & R300_ANY_NEW_SAMPLERS)) { | |||
if (r300->fs && count) { | |||
if (r300_pick_fragment_shader(r300)) { | |||
r300->dirty_state |= R300_NEW_FRAGMENT_SHADER | | |||
R300_NEW_FRAGMENT_SHADER_CONSTANTS; | |||
@@ -925,24 +922,25 @@ static void r300_set_sampler_textures(struct pipe_context* pipe, | |||
struct pipe_texture** texture) | |||
{ | |||
struct r300_context* r300 = r300_context(pipe); | |||
struct r300_textures_state* state = | |||
(struct r300_textures_state*)r300->textures_state.state; | |||
unsigned i; | |||
boolean is_r500 = r300_screen(r300->context.screen)->caps->is_r500; | |||
boolean dirty_tex = FALSE; | |||
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]); | |||
r300->dirty_state |= (R300_NEW_TEXTURE << i); | |||
if (state->textures[i] != (struct r300_texture*)texture[i]) { | |||
pipe_texture_reference((struct pipe_texture**)&state->textures[i], | |||
texture[i]); | |||
dirty_tex = TRUE; | |||
/* R300-specific - set the texrect factor in a fragment shader */ | |||
if (!is_r500 && r300->textures[i]->is_npot) { | |||
/* R300-specific - set the texrect factor in the fragment shader */ | |||
if (!is_r500 && state->textures[i]->is_npot) { | |||
/* XXX It would be nice to re-emit just 1 constant, | |||
* XXX not all of them */ | |||
r300->dirty_state |= R300_NEW_FRAGMENT_SHADER_CONSTANTS; | |||
@@ -951,14 +949,15 @@ static void r300_set_sampler_textures(struct pipe_context* pipe, | |||
} | |||
for (i = count; i < 8; i++) { | |||
if (r300->textures[i]) { | |||
pipe_texture_reference((struct pipe_texture**)&r300->textures[i], | |||
if (state->textures[i]) { | |||
pipe_texture_reference((struct pipe_texture**)&state->textures[i], | |||
NULL); | |||
r300->dirty_state |= (R300_NEW_TEXTURE << i); | |||
} | |||
} | |||
r300->texture_count = count; | |||
state->texture_count = count; | |||
r300->textures_state.dirty = TRUE; | |||
if (dirty_tex) { | |||
r300->texture_cache_inval.dirty = TRUE; |
@@ -431,7 +431,6 @@ static void r300_update_rs_block(struct r300_context* r300, | |||
if (memcmp(r300->rs_block_state.state, &rs, sizeof(struct r300_rs_block))) { | |||
memcpy(r300->rs_block_state.state, &rs, sizeof(struct r300_rs_block)); | |||
r300->rs_block_state.size = 5 + count*2; | |||
r300->rs_block_state.dirty = TRUE; | |||
} | |||
} | |||
@@ -529,6 +528,63 @@ static void r300_update_ztop(struct r300_context* r300) | |||
r300->ztop_state.dirty = TRUE; | |||
} | |||
static void r300_merge_textures_and_samplers(struct r300_context* r300) | |||
{ | |||
struct r300_textures_state *state = | |||
(struct r300_textures_state*)r300->textures_state.state; | |||
struct r300_texture_sampler_state *texstate; | |||
struct r300_sampler_state *sampler; | |||
struct r300_texture *tex; | |||
unsigned min_level, max_level, i, size; | |||
unsigned count = MIN2(state->texture_count, state->sampler_count); | |||
state->tx_enable = 0; | |||
size = 2; | |||
for (i = 0; i < count; i++) { | |||
if (state->textures[i] && state->sampler_states[i]) { | |||
state->tx_enable |= 1 << i; | |||
tex = state->textures[i]; | |||
sampler = state->sampler_states[i]; | |||
texstate = &state->regs[i]; | |||
memcpy(texstate->format, &tex->state, sizeof(uint32_t)*3); | |||
texstate->filter[0] = sampler->filter0; | |||
texstate->filter[1] = sampler->filter1; | |||
texstate->border_color = sampler->border_color; | |||
texstate->tile_config = R300_TXO_MACRO_TILE(tex->macrotile) | | |||
R300_TXO_MICRO_TILE(tex->microtile); | |||
/* to emulate 1D textures through 2D ones correctly */ | |||
if (tex->tex.target == PIPE_TEXTURE_1D) { | |||
texstate->filter[0] &= ~R300_TX_WRAP_T_MASK; | |||
texstate->filter[0] |= R300_TX_WRAP_T(R300_TX_CLAMP_TO_EDGE); | |||
} | |||
if (tex->is_npot) { | |||
/* NPOT textures don't support mip filter, unfortunately. | |||
* This prevents incorrect rendering. */ | |||
texstate->filter[0] &= ~R300_TX_MIN_FILTER_MIP_MASK; | |||
} else { | |||
/* determine min/max levels */ | |||
/* the MAX_MIP level is the largest (finest) one */ | |||
max_level = MIN2(sampler->max_lod, tex->tex.last_level); | |||
min_level = MIN2(sampler->min_lod, max_level); | |||
texstate->format[0] |= R300_TX_NUM_LEVELS(max_level); | |||
texstate->filter[0] |= R300_TX_MAX_MIP_LEVEL(min_level); | |||
} | |||
texstate->filter[0] |= i << 28; | |||
size += 16; | |||
state->count = i+1; | |||
} | |||
} | |||
r300->textures_state.size = size; | |||
} | |||
void r300_update_derived_state(struct r300_context* r300) | |||
{ | |||
if (r300->rs_block_state.dirty || | |||
@@ -537,5 +593,9 @@ void r300_update_derived_state(struct r300_context* r300) | |||
r300_update_derived_shader_state(r300); | |||
} | |||
if (r300->textures_state.dirty) { | |||
r300_merge_textures_and_samplers(r300); | |||
} | |||
r300_update_ztop(r300); | |||
} |
@@ -505,7 +505,7 @@ boolean r300_is_sampler_format_supported(enum pipe_format format) | |||
static void r300_setup_texture_state(struct r300_screen* screen, struct r300_texture* tex) | |||
{ | |||
struct r300_texture_state* state = &tex->state; | |||
struct r300_texture_format_state* state = &tex->state; | |||
struct pipe_texture *pt = &tex->tex; | |||
unsigned i; | |||
boolean is_r500 = screen->caps->is_r500; |