r300g: raise the number of texture units to 16 for all supported chipsets
authorMarek Olšák <maraeo@gmail.com>
Mon, 5 Apr 2010 00:11:26 +0000 (02:11 +0200)
committerMarek Olšák <maraeo@gmail.com>
Mon, 5 Apr 2010 05:09:45 +0000 (07:09 +0200)
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
src/gallium/drivers/r300/r300_chipset.h
src/gallium/drivers/r300/r300_context.h
src/gallium/drivers/r300/r300_screen.c
src/gallium/drivers/r300/r300_state.c
src/gallium/drivers/r300/r300_state_inlines.h

index 417198626352bc2a78044a6773cf2555668e8720..9b2163e44cca92c85ba6c166a3621ed3c2558323 100644 (file)
@@ -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. */
index 28084864929c0e35284bf4045187707fe7204142..ff957b7c29ccbf24c621d7df56a3791e490ad337 100644 (file)
@@ -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
index 4689701bd1dd446bebded20e783f05257287827f..108ab453a47165accdfc12a72387ffcd148a4142 100644 (file)
@@ -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 {
index 50e5e9307e9a9295cb1037c89f8f684301c80a14..0a98458dc37c3af4c41eb1fa0caba38463bebad8 100644 (file)
@@ -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 */
index dc94c95e69f4bb7c1bd7b233060762638333cacb..d1486a203950a35a771125ed0cb9ed3d0be6b1a8 100644 (file)
@@ -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);
index 8a690039b6b437af6d373f0ec739a478db3914ae..044d70cbe821d9b382f99f0bb510cd1868687738 100644 (file)
@@ -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.) */