diff options
Diffstat (limited to 'src/gallium/drivers')
| -rw-r--r-- | src/gallium/drivers/r300/r300_blit.c | 8 | ||||
| -rw-r--r-- | src/gallium/drivers/r300/r300_context.c | 3 | ||||
| -rw-r--r-- | src/gallium/drivers/r300/r300_context.h | 35 | ||||
| -rw-r--r-- | src/gallium/drivers/r300/r300_emit.c | 115 | ||||
| -rw-r--r-- | src/gallium/drivers/r300/r300_emit.h | 11 | ||||
| -rw-r--r-- | src/gallium/drivers/r300/r300_fs.c | 7 | ||||
| -rw-r--r-- | src/gallium/drivers/r300/r300_state.c | 43 | ||||
| -rw-r--r-- | src/gallium/drivers/r300/r300_state_derived.c | 62 | ||||
| -rw-r--r-- | src/gallium/drivers/r300/r300_texture.c | 2 | 
9 files changed, 152 insertions, 134 deletions
| diff --git a/src/gallium/drivers/r300/r300_blit.c b/src/gallium/drivers/r300/r300_blit.c index 187b4bf384..32d05749bd 100644 --- a/src/gallium/drivers/r300/r300_blit.c +++ b/src/gallium/drivers/r300/r300_blit.c @@ -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, diff --git a/src/gallium/drivers/r300/r300_context.c b/src/gallium/drivers/r300/r300_context.c index 1d7d598b24..86b98a4ba5 100644 --- a/src/gallium/drivers/r300/r300_context.c +++ b/src/gallium/drivers/r300/r300_context.c @@ -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); diff --git a/src/gallium/drivers/r300/r300_context.h b/src/gallium/drivers/r300/r300_context.h index 3eb884a0cf..b98fe347b8 100644 --- a/src/gallium/drivers/r300/r300_context.h +++ b/src/gallium/drivers/r300/r300_context.h @@ -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. */ diff --git a/src/gallium/drivers/r300/r300_emit.c b/src/gallium/drivers/r300/r300_emit.c index 6a6771399a..17d55ba3b4 100644 --- a/src/gallium/drivers/r300/r300_emit.c +++ b/src/gallium/drivers/r300/r300_emit.c @@ -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); -    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 + (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]); -    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); diff --git a/src/gallium/drivers/r300/r300_emit.h b/src/gallium/drivers/r300/r300_emit.h index a2c2a91b88..449e640a88 100644 --- a/src/gallium/drivers/r300/r300_emit.h +++ b/src/gallium/drivers/r300/r300_emit.h @@ -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); diff --git a/src/gallium/drivers/r300/r300_fs.c b/src/gallium/drivers/r300/r300_fs.c index ae4c62b2f1..3c2625269b 100644 --- a/src/gallium/drivers/r300/r300_fs.c +++ b/src/gallium/drivers/r300/r300_fs.c @@ -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 diff --git a/src/gallium/drivers/r300/r300_state.c b/src/gallium/drivers/r300/r300_state.c index 5a47158400..12bf083871 100644 --- a/src/gallium/drivers/r300/r300_state.c +++ b/src/gallium/drivers/r300/r300_state.c @@ -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; diff --git a/src/gallium/drivers/r300/r300_state_derived.c b/src/gallium/drivers/r300/r300_state_derived.c index 0574d98e07..6eb7f2bfd1 100644 --- a/src/gallium/drivers/r300/r300_state_derived.c +++ b/src/gallium/drivers/r300/r300_state_derived.c @@ -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);  } diff --git a/src/gallium/drivers/r300/r300_texture.c b/src/gallium/drivers/r300/r300_texture.c index 7c3b781c0b..2246c75056 100644 --- a/src/gallium/drivers/r300/r300_texture.c +++ b/src/gallium/drivers/r300/r300_texture.c @@ -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; | 
