Mesa (master): r300g: raise the number of texture units to 16 for all supported chipsets

Marek Olšák mareko at kemper.freedesktop.org
Mon Apr 5 05:10:13 UTC 2010


Module: Mesa
Branch: master
Commit: d2686cdb2354b7cfe0e4eac3c5afab40cb947e0f
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=d2686cdb2354b7cfe0e4eac3c5afab40cb947e0f

Author: Marek Olšák <maraeo at gmail.com>
Date:   Mon Apr  5 02:11:26 2010 +0200

r300g: raise the number of texture units to 16 for all supported chipsets

As per Radeon 9700 Opengl Programming and Optimization Guide [1], there are
16 texture units even on the first r300 chipsets. If you think I am wrong,
feel free to propose a patch.

[1] Here's PDF: http://people.freedesktop.org/~mareko/

---

 src/gallium/drivers/r300/r300_chipset.c       |    2 +-
 src/gallium/drivers/r300/r300_chipset.h       |    2 ++
 src/gallium/drivers/r300/r300_context.h       |    6 +++---
 src/gallium/drivers/r300/r300_screen.c        |    3 +--
 src/gallium/drivers/r300/r300_state.c         |    9 +++++----
 src/gallium/drivers/r300/r300_state_inlines.h |    2 +-
 6 files changed, 13 insertions(+), 11 deletions(-)

diff --git a/src/gallium/drivers/r300/r300_chipset.c b/src/gallium/drivers/r300/r300_chipset.c
index 4171986..9b2163e 100644
--- a/src/gallium/drivers/r300/r300_chipset.c
+++ b/src/gallium/drivers/r300/r300_chipset.c
@@ -34,12 +34,12 @@ void r300_parse_chipset(struct r300_capabilities* caps)
 {
     /* Reasonable defaults */
     caps->num_vert_fpus = 4;
+    caps->num_tex_units = 16;
     caps->has_tcl = debug_get_bool_option("RADEON_NO_TCL", FALSE) ? FALSE : TRUE;
     caps->is_r400 = FALSE;
     caps->is_r500 = FALSE;
     caps->high_second_pipe = FALSE;
 
-
     /* Note: These are not ordered by PCI ID. I leave that task to GCC,
      * which will perform the ordering while collating jump tables. Instead,
      * I've tried to group them according to capabilities and age. */
diff --git a/src/gallium/drivers/r300/r300_chipset.h b/src/gallium/drivers/r300/r300_chipset.h
index 2808486..ff957b7 100644
--- a/src/gallium/drivers/r300/r300_chipset.h
+++ b/src/gallium/drivers/r300/r300_chipset.h
@@ -38,6 +38,8 @@ struct r300_capabilities {
     unsigned num_frag_pipes;
     /* The number of z pipes */
     unsigned num_z_pipes;
+    /* The number of texture units. */
+    unsigned num_tex_units;
     /* Whether or not TCL is physically present */
     boolean has_tcl;
     /* Whether or not this is R400. The differences compared to their R3xx
diff --git a/src/gallium/drivers/r300/r300_context.h b/src/gallium/drivers/r300/r300_context.h
index 4689701..108ab45 100644
--- a/src/gallium/drivers/r300/r300_context.h
+++ b/src/gallium/drivers/r300/r300_context.h
@@ -138,10 +138,10 @@ struct r300_texture_fb_state {
 
 struct r300_textures_state {
     /* Textures. */
-    struct pipe_sampler_view *fragment_sampler_views[8];
+    struct pipe_sampler_view *fragment_sampler_views[16];
     int texture_count;
     /* Sampler states. */
-    struct r300_sampler_state *sampler_states[8];
+    struct r300_sampler_state *sampler_states[16];
     int sampler_count;
 
     /* These is the merge of the texture and sampler states. */
@@ -152,7 +152,7 @@ struct r300_textures_state {
         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];
+    } regs[16];
 };
 
 struct r300_vertex_stream_state {
diff --git a/src/gallium/drivers/r300/r300_screen.c b/src/gallium/drivers/r300/r300_screen.c
index 50e5e93..0a98458 100644
--- a/src/gallium/drivers/r300/r300_screen.c
+++ b/src/gallium/drivers/r300/r300_screen.c
@@ -82,8 +82,7 @@ static int r300_get_param(struct pipe_screen* pscreen, int param)
     switch (param) {
         case PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS:
         case PIPE_CAP_MAX_COMBINED_SAMPLERS:
-            /* XXX I'm told this goes up to 16 */
-            return 8;
+            return r300screen->caps->num_tex_units;
         case PIPE_CAP_NPOT_TEXTURES:
             /* XXX enable now to get GL2.1 API,
              * figure out later how to emulate this */
diff --git a/src/gallium/drivers/r300/r300_state.c b/src/gallium/drivers/r300/r300_state.c
index dc94c95..d1486a2 100644
--- a/src/gallium/drivers/r300/r300_state.c
+++ b/src/gallium/drivers/r300/r300_state.c
@@ -908,8 +908,9 @@ static void r300_bind_sampler_states(struct pipe_context* pipe,
     struct r300_context* r300 = r300_context(pipe);
     struct r300_textures_state* state =
         (struct r300_textures_state*)r300->textures_state.state;
+    unsigned tex_units = r300_screen(r300->context.screen)->caps->num_tex_units;
 
-    if (count > 8) {
+    if (count > tex_units) {
         return;
     }
 
@@ -947,11 +948,11 @@ static void r300_set_fragment_sampler_views(struct pipe_context* pipe,
         (struct r300_textures_state*)r300->textures_state.state;
     struct r300_texture *texture;
     unsigned i;
+    unsigned tex_units = r300_screen(r300->context.screen)->caps->num_tex_units;
     boolean is_r500 = r300_screen(r300->context.screen)->caps->is_r500;
     boolean dirty_tex = FALSE;
 
-    /* XXX magic num */
-    if (count > 8) {
+    if (count > tex_units) {
         return;
     }
 
@@ -977,7 +978,7 @@ static void r300_set_fragment_sampler_views(struct pipe_context* pipe,
         }
     }
 
-    for (i = count; i < 8; i++) {
+    for (i = count; i < tex_units; i++) {
         if (state->fragment_sampler_views[i]) {
             pipe_sampler_view_reference(&state->fragment_sampler_views[i],
                                         NULL);
diff --git a/src/gallium/drivers/r300/r300_state_inlines.h b/src/gallium/drivers/r300/r300_state_inlines.h
index 8a69003..044d70c 100644
--- a/src/gallium/drivers/r300/r300_state_inlines.h
+++ b/src/gallium/drivers/r300/r300_state_inlines.h
@@ -338,7 +338,7 @@ static INLINE uint32_t r500_anisotropy(unsigned max_aniso)
 
     // Map the range [0, 15] to [0, 63].
     return R500_TX_MAX_ANISO(MIN2((unsigned)(max_aniso*4.2001), 63)) |
-           R500_TX_ANISO_HIGH_QUALITY;;
+           R500_TX_ANISO_HIGH_QUALITY;
 }
 
 /* Non-CSO state. (For now.) */




More information about the mesa-commit mailing list