i965g: more work on compilation
[mesa.git] / src / gallium / drivers / i965 / brw_wm_sampler_state.c
index 32692d533c4ebf896eeb3341cda9a1c57fc79fe9..55698a58bbc520d67a4486de1557e9cfb0f07788 100644 (file)
   *   Keith Whitwell <keith@tungstengraphics.com>
   */
                    
+#include "util/u_math.h"
 
 #include "brw_context.h"
 #include "brw_state.h"
 #include "brw_defines.h"
+#include "brw_screen.h"
 
 
 /* Samplers aren't strictly wm state from the hardware's perspective,
 
 
 
-/* The brw (and related graphics cores) do not support GL_CLAMP.  The
- * Intel drivers for "other operating systems" implement GL_CLAMP as
- * GL_CLAMP_TO_EDGE, so the same is done here.
- */
-static GLuint translate_wrap_mode( GLenum wrap )
-{
-   switch( wrap ) {
-   case GL_REPEAT: 
-      return BRW_TEXCOORDMODE_WRAP;
-   case GL_CLAMP:  
-      return BRW_TEXCOORDMODE_CLAMP;
-   case GL_CLAMP_TO_EDGE: 
-      return BRW_TEXCOORDMODE_CLAMP; /* conform likes it this way */
-   case GL_CLAMP_TO_BORDER: 
-      return BRW_TEXCOORDMODE_CLAMP_BORDER;
-   case GL_MIRRORED_REPEAT: 
-      return BRW_TEXCOORDMODE_MIRROR;
-   default: 
-      return BRW_TEXCOORDMODE_WRAP;
-   }
-}
-
-
-static GLuint U_FIXED(GLfloat value, GLuint frac_bits)
-{
-   value *= (1<<frac_bits);
-   return value < 0 ? 0 : value;
-}
-
-static GLint S_FIXED(GLfloat value, GLuint frac_bits)
-{
-   return value * (1<<frac_bits);
-}
-
-
 static struct brw_winsys_buffer *
 upload_default_color( struct brw_context *brw,
                      const GLfloat *color )
@@ -91,91 +58,78 @@ upload_default_color( struct brw_context *brw,
 
 struct wm_sampler_key {
    int sampler_count;
-
-   struct wm_sampler_entry {
-      GLenum tex_target;
-      GLenum wrap_r, wrap_s, wrap_t;
-      float maxlod, minlod;
-      float lod_bias;
-      float max_aniso;
-      GLenum minfilter, magfilter;
-      GLenum comparemode, comparefunc;
-      struct brw_winsys_buffer *sdc_bo;
-
-      /** If target is cubemap, take context setting.
-       */
-      GLboolean seamless_cube_map;
-   } sampler[BRW_MAX_TEX_UNIT];
+   struct brw_sampler_state sampler[BRW_MAX_TEX_UNIT];
 };
 
-/**
- * Sets the sampler state for a single unit based off of the sampler key
- * entry.
- */
-static void brw_update_sampler_state(struct wm_sampler_entry *key,
-                                    struct brw_winsys_buffer *sdc_bo,
-                                    struct brw_sampler_state *sampler)
-{
-   _mesa_memset(sampler, 0, sizeof(*sampler));
-
-   /* Cube-maps on 965 and later must use the same wrap mode for all 3
-    * coordinate dimensions.  Futher, only CUBE and CLAMP are valid.
-    */
-   if (key->tex_target == GL_TEXTURE_CUBE_MAP) {
-      if (key->seamless_cube_map &&
-         (key->minfilter != GL_NEAREST || key->magfilter != GL_NEAREST)) {
-        sampler->ss1.r_wrap_mode = BRW_TEXCOORDMODE_CUBE;
-        sampler->ss1.s_wrap_mode = BRW_TEXCOORDMODE_CUBE;
-        sampler->ss1.t_wrap_mode = BRW_TEXCOORDMODE_CUBE;
-      } else {
-        sampler->ss1.r_wrap_mode = BRW_TEXCOORDMODE_CLAMP;
-        sampler->ss1.s_wrap_mode = BRW_TEXCOORDMODE_CLAMP;
-        sampler->ss1.t_wrap_mode = BRW_TEXCOORDMODE_CLAMP;
-      }
-   } else if (key->tex_target == GL_TEXTURE_1D) {
-      /* There's a bug in 1D texture sampling - it actually pays
-       * attention to the wrap_t value, though it should not.
-       * Override the wrap_t value here to GL_REPEAT to keep
-       * any nonexistent border pixels from floating in.
-       */
-      sampler->ss1.t_wrap_mode = BRW_TEXCOORDMODE_WRAP;
-   }
-
-
-
-   sampler->ss2.default_color_pointer = sdc_bo->offset >> 5; /* reloc */
-}
-
 
 /** Sets up the cache key for sampler state for all texture units */
 static void
 brw_wm_sampler_populate_key(struct brw_context *brw,
                            struct wm_sampler_key *key)
 {
-   int nr = MIN2(brw->curr.number_textures,
-                brw->curr.number_samplers);
    int i;
 
    memset(key, 0, sizeof(*key));
 
-   for (i = 0; i < nr; i++) {
+   key->sampler_count = MIN2(brw->curr.num_textures,
+                           brw->curr.num_samplers);
+
+   for (i = 0; i < key->sampler_count; i++) {
       const struct brw_texture *tex = brw->curr.texture[i];
       const struct brw_sampler *sampler = brw->curr.sampler[i];
-      struct wm_sampler_entry *entry = &key->sampler[i];
+      struct brw_sampler_state *entry = &key->sampler[i];
 
-      entry->tex_target = texObj->Target;
-      entry->seamless_cube_map = FALSE; /* XXX: add this to gallium */
       entry->ss0 = sampler->ss0;
       entry->ss1 = sampler->ss1;
+      entry->ss2.default_color_pointer = brw->wm.sdc_bo[i]->offset >> 5; /* reloc */
       entry->ss3 = sampler->ss3;
 
+      /* Cube-maps on 965 and later must use the same wrap mode for all 3
+       * coordinate dimensions.  Futher, only CUBE and CLAMP are valid.
+       */
+      if (tex->base.target == PIPE_TEXTURE_CUBE) {
+        if (FALSE &&
+            (sampler->ss0.min_filter != BRW_MAPFILTER_NEAREST || 
+             sampler->ss0.mag_filter != BRW_MAPFILTER_NEAREST)) {
+           entry->ss1.r_wrap_mode = BRW_TEXCOORDMODE_CUBE;
+           entry->ss1.s_wrap_mode = BRW_TEXCOORDMODE_CUBE;
+           entry->ss1.t_wrap_mode = BRW_TEXCOORDMODE_CUBE;
+        } else {
+           entry->ss1.r_wrap_mode = BRW_TEXCOORDMODE_CLAMP;
+           entry->ss1.s_wrap_mode = BRW_TEXCOORDMODE_CLAMP;
+           entry->ss1.t_wrap_mode = BRW_TEXCOORDMODE_CLAMP;
+        }
+      } else if (tex->base.target == PIPE_TEXTURE_1D) {
+        /* There's a bug in 1D texture sampling - it actually pays
+         * attention to the wrap_t value, though it should not.
+         * Override the wrap_t value here to GL_REPEAT to keep
+         * any nonexistent border pixels from floating in.
+         */
+        entry->ss1.t_wrap_mode = BRW_TEXCOORDMODE_WRAP;
+      }
+   }
+}
+
+
+static void
+brw_wm_sampler_update_default_colors(struct brw_context *brw)
+{
+   int nr = MIN2(brw->curr.num_textures,
+                brw->curr.num_samplers);
+   int i;
+
+   for (i = 0; i < nr; i++) {
+      const struct brw_texture *tex = brw->curr.texture[i];
+      const struct brw_sampler *sampler = brw->curr.sampler[i];
+
       brw->sws->bo_unreference(brw->wm.sdc_bo[i]);
-      if (firstImage->_BaseFormat == GL_DEPTH_COMPONENT) {
+
+      if (pf_is_depth_or_stencil(tex->base.format)) {
         float bordercolor[4] = {
-           texObj->BorderColor[0],
-           texObj->BorderColor[0],
-           texObj->BorderColor[0],
-           texObj->BorderColor[0]
+           sampler->templ.border_color[0],
+           sampler->templ.border_color[0],
+           sampler->templ.border_color[0],
+           sampler->templ.border_color[0]
         };
         /* GL specs that border color for depth textures is taken from the
          * R channel, while the hardware uses A.  Spam R into all the
@@ -183,22 +137,21 @@ brw_wm_sampler_populate_key(struct brw_context *brw,
          */
         brw->wm.sdc_bo[i] = upload_default_color(brw, bordercolor);
       } else {
-        brw->wm.sdc_bo[i] = upload_default_color(brw, texObj->BorderColor);
+        brw->wm.sdc_bo[i] = upload_default_color(brw, sampler->templ.border_color);
       }
    }
-
-   key->sampler_count = nr;
 }
 
-/* All samplers must be uploaded in a single contiguous array, which
- * complicates various things.  However, this is still too confusing -
- * FIXME: simplify all the different new texture state flags.
+
+
+/* All samplers must be uploaded in a single contiguous array.  
  */
-static void upload_wm_samplers( struct brw_context *brw )
+static int upload_wm_samplers( struct brw_context *brw )
 {
    struct wm_sampler_key key;
    int i;
 
+   brw_wm_sampler_update_default_colors(brw);
    brw_wm_sampler_populate_key(brw, &key);
 
    if (brw->wm.sampler_count != key.sampler_count) {
@@ -209,7 +162,7 @@ static void upload_wm_samplers( struct brw_context *brw )
    brw->sws->bo_unreference(brw->wm.sampler_bo);
    brw->wm.sampler_bo = NULL;
    if (brw->wm.sampler_count == 0)
-      return;
+      return 0;
 
    brw->wm.sampler_bo = brw_search_cache(&brw->cache, BRW_SAMPLER,
                                         &key, sizeof(key),
@@ -220,41 +173,29 @@ static void upload_wm_samplers( struct brw_context *brw )
     * cache.
     */
    if (brw->wm.sampler_bo == NULL) {
-      struct brw_sampler_state sampler[BRW_MAX_TEX_UNIT];
-
-      memset(sampler, 0, sizeof(sampler));
-      for (i = 0; i < key.sampler_count; i++) {
-        if (brw->wm.sdc_bo[i] == NULL)
-           continue;
-
-        brw_update_sampler_state(&key.sampler[i], brw->wm.sdc_bo[i],
-                                 &sampler[i]);
-      }
-
       brw->wm.sampler_bo = brw_upload_cache(&brw->cache, BRW_SAMPLER,
                                            &key, sizeof(key),
                                            brw->wm.sdc_bo, key.sampler_count,
-                                           &sampler, sizeof(sampler),
+                                           &key.sampler, sizeof(key.sampler),
                                            NULL, NULL);
 
       /* Emit SDC relocations */
-      for (i = 0; i < BRW_MAX_TEX_UNIT; i++) {
-        if (!ctx->Texture.Unit[i]._ReallyEnabled)
-           continue;
-
-        dri_bo_emit_reloc(brw->wm.sampler_bo,
-                          I915_GEM_DOMAIN_SAMPLER, 0,
-                          0,
-                          i * sizeof(struct brw_sampler_state) +
-                          offsetof(struct brw_sampler_state, ss2),
-                          brw->wm.sdc_bo[i]);
+      for (i = 0; i < key.sampler_count; i++) {
+        brw->sws->bo_emit_reloc(brw->wm.sampler_bo,
+                                I915_GEM_DOMAIN_SAMPLER, 0,
+                                0,
+                                i * sizeof(struct brw_sampler_state) +
+                                offsetof(struct brw_sampler_state, ss2),
+                                brw->wm.sdc_bo[i]);
       }
    }
+
+   return 0;
 }
 
 const struct brw_tracked_state brw_wm_samplers = {
    .dirty = {
-      .mesa = PIPE_NEW_BOUND_TEXTURES | PIPE_NEW_SAMPLER,
+      .mesa = PIPE_NEW_BOUND_TEXTURES | PIPE_NEW_SAMPLERS,
       .brw = 0,
       .cache = 0
    },