On 06/12/2012 11:38 AM, Pauli Nieminen wrote:
Preparation for the mandator support of ARB_shader_object. I have tested

s/shader_object/sampler_object/ in the subject and body, right?

this patch with rv280 only. While only compile testing radeon changes.

Does someone want to run piglit tests for radeon too?

Signed-off-by: Pauli Nieminen<pauli.niemi...@linux.intel.com>
Reviewed-by: Brian Paul<bri...@vmware.com>
---
  src/mesa/drivers/dri/r200/r200_tex.c             |   33 ++++++++++++-------
  src/mesa/drivers/dri/r200/r200_tex.h             |    1 +
  src/mesa/drivers/dri/r200/r200_texstate.c        |    3 +-
  src/mesa/drivers/dri/radeon/radeon_mipmap_tree.c |   16 +++++----
  src/mesa/drivers/dri/radeon/radeon_span.c        |    4 ++-
  src/mesa/drivers/dri/radeon/radeon_tex.c         |   38 +++++++++++++---------
  src/mesa/drivers/dri/radeon/radeon_tex.h         |    1 +
  src/mesa/drivers/dri/radeon/radeon_tex_copy.c    |    2 +-
  src/mesa/drivers/dri/radeon/radeon_texstate.c    |    4 ++-
  src/mesa/drivers/dri/radeon/radeon_texture.h     |    4 ++-
  10 files changed, 67 insertions(+), 39 deletions(-)

diff --git a/src/mesa/drivers/dri/r200/r200_tex.c 
b/src/mesa/drivers/dri/r200/r200_tex.c
index fe7c977..9d52095 100644
--- a/src/mesa/drivers/dri/r200/r200_tex.c
+++ b/src/mesa/drivers/dri/r200/r200_tex.c
@@ -41,6 +41,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 
SOFTWARE.
  #include "main/simple_list.h"
  #include "main/teximage.h"
  #include "main/texobj.h"
+#include "main/samplerobj.h"

  #include "radeon_mipmap_tree.h"
  #include "r200_context.h"
@@ -360,12 +361,21 @@ static void r200TexEnv( struct gl_context *ctx, GLenum 
target,
     }
  }

+void r200TexUpdateParameters(struct gl_context *ctx, GLuint unit)
+{
+   struct gl_sampler_object *samp = _mesa_get_samplerobj(ctx, unit);
+   radeonTexObj* t = radeon_tex_obj(ctx->Texture.Unit[unit]._Current);
+
+   r200SetTexMaxAnisotropy(t , samp->MaxAnisotropy);
+   r200SetTexFilter(t, samp->MinFilter, samp->MagFilter);
+   r200SetTexWrap(t, samp->WrapS, samp->WrapT, samp->WrapR);
+   r200SetTexBorderColor(t, samp->BorderColor.f);
+}

  /**
   * Changes variables and flags for a state update, which will happen at the
   * next UpdateTextureState
   */
-
  static void r200TexParameter( struct gl_context *ctx, GLenum target,
                                struct gl_texture_object *texObj,
                                GLenum pname, const GLfloat *params )
@@ -382,20 +392,10 @@ static void r200TexParameter( struct gl_context *ctx, 
GLenum target,
     case GL_TEXTURE_MIN_FILTER:
     case GL_TEXTURE_MAG_FILTER:
     case GL_TEXTURE_MAX_ANISOTROPY_EXT:
-      r200SetTexMaxAnisotropy( t, texObj->Sampler.MaxAnisotropy );
-      r200SetTexFilter( t, texObj->Sampler.MinFilter, 
texObj->Sampler.MagFilter );
-      break;
-
     case GL_TEXTURE_WRAP_S:
     case GL_TEXTURE_WRAP_T:
     case GL_TEXTURE_WRAP_R:
-      r200SetTexWrap( t, texObj->Sampler.WrapS, texObj->Sampler.WrapT, 
texObj->Sampler.WrapR );
-      break;
-
     case GL_TEXTURE_BORDER_COLOR:
-      r200SetTexBorderColor( t, texObj->Sampler.BorderColor.f );
-      break;
-
     case GL_TEXTURE_BASE_LEVEL:
     case GL_TEXTURE_MAX_LEVEL:
     case GL_TEXTURE_MIN_LOD:
@@ -489,6 +489,16 @@ static struct gl_texture_object 
*r200NewTextureObject(struct gl_context * ctx,
     return&t->base;
  }

+static struct gl_sampler_object *
+r200NewSamplerObject(struct gl_context *ctx, GLuint name)
+{
+   r200ContextPtr rmesa = R200_CONTEXT(ctx);
+   struct gl_sampler_object *samp = _mesa_new_sampler_object(ctx, name);
+   if (samp)
+      samp->MaxAnisotropy = rmesa->radeon.initialMaxAnisotropy;
+   return samp;
+}
+


  void r200InitTextureFuncs( radeonContextPtr radeon, struct dd_function_table 
*functions )
@@ -506,4 +516,5 @@ void r200InitTextureFuncs( radeonContextPtr radeon, struct 
dd_function_table *fu
     functions->TexEnv                       = r200TexEnv;
     functions->TexParameter         = r200TexParameter;
     functions->TexGen                       = r200TexGen;
+   functions->NewSamplerObject              = r200NewSamplerObject;
  }
diff --git a/src/mesa/drivers/dri/r200/r200_tex.h 
b/src/mesa/drivers/dri/r200/r200_tex.h
index 756a128..725b45d 100644
--- a/src/mesa/drivers/dri/r200/r200_tex.h
+++ b/src/mesa/drivers/dri/r200/r200_tex.h
@@ -48,6 +48,7 @@ extern void r200DestroyTexObj( r200ContextPtr rmesa, 
radeonTexObjPtr t );
  extern void r200InitTextureFuncs( radeonContextPtr radeon, struct 
dd_function_table *functions );

  extern void r200UpdateFragmentShader( struct gl_context *ctx );
+extern void r200TexUpdateParameters(struct gl_context *ctx, GLuint unit);

  extern void set_re_cntl_d3d( struct gl_context *ctx, int unit, GLboolean 
use_d3d );

diff --git a/src/mesa/drivers/dri/r200/r200_texstate.c 
b/src/mesa/drivers/dri/r200/r200_texstate.c
index 19e77c5..b25c611 100644
--- a/src/mesa/drivers/dri/r200/r200_texstate.c
+++ b/src/mesa/drivers/dri/r200/r200_texstate.c
@@ -1500,7 +1500,7 @@ static GLboolean r200_validate_texture(struct gl_context 
*ctx, struct gl_texture
     r200ContextPtr rmesa = R200_CONTEXT(ctx);
     radeonTexObj *t = radeon_tex_obj(texObj);

-   if (!radeon_validate_texture_miptree(ctx, texObj))
+   if (!radeon_validate_texture_miptree(ctx, _mesa_get_samplerobj(ctx, unit), 
texObj))
        return GL_FALSE;

     r200_validate_texgen(ctx, unit);
@@ -1522,6 +1522,7 @@ static GLboolean r200_validate_texture(struct gl_context 
*ctx, struct gl_texture
     rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_1] |= 4<<  (unit * 3);

     rmesa->recheck_texgen[unit] = GL_TRUE;
+   r200TexUpdateParameters(ctx, unit);
     import_tex_obj_state( rmesa, unit, t );

     if (rmesa->recheck_texgen[unit]) {
diff --git a/src/mesa/drivers/dri/radeon/radeon_mipmap_tree.c 
b/src/mesa/drivers/dri/radeon/radeon_mipmap_tree.c
index ca5dadc..495baec 100644
--- a/src/mesa/drivers/dri/radeon/radeon_mipmap_tree.c
+++ b/src/mesa/drivers/dri/radeon/radeon_mipmap_tree.c
@@ -249,7 +249,7 @@ void radeon_miptree_unreference(radeon_mipmap_tree **ptr)
   * @param[out] pminLod minimal LOD
   * @param[out] pmaxLod maximal LOD
   */
-static void calculate_min_max_lod(struct gl_texture_object *tObj,
+static void calculate_min_max_lod(struct gl_sampler_object *samp, struct 
gl_texture_object *tObj,
                                       unsigned *pminLod, unsigned *pmaxLod)
  {
        int minLod, maxLod;
@@ -260,15 +260,15 @@ static void calculate_min_max_lod(struct 
gl_texture_object *tObj,
        case GL_TEXTURE_2D:
        case GL_TEXTURE_3D:
        case GL_TEXTURE_CUBE_MAP:
-               if (tObj->Sampler.MinFilter == GL_NEAREST || 
tObj->Sampler.MinFilter == GL_LINEAR) {
+               if (samp->MinFilter == GL_NEAREST || samp->MinFilter == 
GL_LINEAR) {
                        /* GL_NEAREST and GL_LINEAR only care about 
GL_TEXTURE_BASE_LEVEL.
                        */
                        minLod = maxLod = tObj->BaseLevel;
                } else {
-                       minLod = tObj->BaseLevel + 
(GLint)(tObj->Sampler.MinLod);
+                       minLod = tObj->BaseLevel + (GLint)(samp->MinLod);
                        minLod = MAX2(minLod, tObj->BaseLevel);
                        minLod = MIN2(minLod, tObj->MaxLevel);
-                       maxLod = tObj->BaseLevel + (GLint)(tObj->Sampler.MaxLod 
+ 0.5);
+                       maxLod = tObj->BaseLevel + (GLint)(samp->MaxLod + 0.5);
                        maxLod = MIN2(maxLod, tObj->MaxLevel);
                        maxLod = MIN2(maxLod, tObj->Image[0][minLod]->MaxLog2 + 
minLod);
                        maxLod = MAX2(maxLod, minLod); /* need at least one 
level */
@@ -536,17 +536,19 @@ static radeon_mipmap_tree * 
get_biggest_matching_miptree(radeonTexObj *texObj,
   * If individual images are stored in different mipmap trees
   * use the mipmap tree that has the most of the correct data.
   */
-int radeon_validate_texture_miptree(struct gl_context * ctx, struct 
gl_texture_object *texObj)
+int radeon_validate_texture_miptree(struct gl_context * ctx,
+                                   struct gl_sampler_object *samp,
+                                   struct gl_texture_object *texObj)
  {
        radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
        radeonTexObj *t = radeon_tex_obj(texObj);
        radeon_mipmap_tree *dst_miptree;

-       if (t->validated || t->image_override) {
+       if (samp ==&texObj->Sampler&&  (t->validated || t->image_override)) {
                return GL_TRUE;
        }

-       calculate_min_max_lod(&t->base,&t->minLod,&t->maxLod);
+       calculate_min_max_lod(samp,&t->base,&t->minLod,&t->maxLod);

        radeon_print(RADEON_TEXTURE, RADEON_NORMAL,
                        "%s: Validating texture %p now, minLod = %d, maxLod = 
%d\n",
diff --git a/src/mesa/drivers/dri/radeon/radeon_span.c 
b/src/mesa/drivers/dri/radeon/radeon_span.c
index 1f2ba49..06b1455 100644
--- a/src/mesa/drivers/dri/radeon/radeon_span.c
+++ b/src/mesa/drivers/dri/radeon/radeon_span.c
@@ -43,6 +43,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 
SOFTWARE.
  #include "main/glheader.h"
  #include "main/texformat.h"
  #include "main/renderbuffer.h"
+#include "main/samplerobj.h"
  #include "swrast/swrast.h"
  #include "swrast/s_renderbuffer.h"

@@ -122,7 +123,8 @@ static void radeonSpanRenderStart(struct gl_context * ctx)

        for (i = 0; i<  ctx->Const.MaxTextureImageUnits; i++) {
                if (ctx->Texture.Unit[i]._ReallyEnabled) {
-                       radeon_validate_texture_miptree(ctx, 
ctx->Texture.Unit[i]._Current);
+                       radeon_validate_texture_miptree(ctx, 
_mesa_get_samplerobj(ctx, i),
+                                                       
ctx->Texture.Unit[i]._Current);
                        radeon_swrast_map_texture_images(ctx, 
ctx->Texture.Unit[i]._Current);
                }
        }
diff --git a/src/mesa/drivers/dri/radeon/radeon_tex.c 
b/src/mesa/drivers/dri/radeon/radeon_tex.c
index 71bd464..fcd9a76 100644
--- a/src/mesa/drivers/dri/radeon/radeon_tex.c
+++ b/src/mesa/drivers/dri/radeon/radeon_tex.c
@@ -312,6 +312,17 @@ static void radeonTexEnv( struct gl_context *ctx, GLenum 
target,
     }
  }

+void radeonTexUpdateParameters(struct gl_context *ctx, GLuint unit)
+{
+   struct gl_sampler_object *samp = _mesa_get_samplerobj(ctx, unit);
+   radeonTexObj* t = radeon_tex_obj(ctx->Texture.Unit[unit]._Current);
+
+   radeonSetTexMaxAnisotropy(t , samp->MaxAnisotropy);
+   radeonSetTexFilter(t, samp->MinFilter, samp->MagFilter);
+   radeonSetTexWrap(t, samp->WrapS, samp->WrapT);
+   radeonSetTexBorderColor(t, samp->BorderColor.f);
+}
+

  /**
   * Changes variables and flags for a state update, which will happen at the
@@ -328,22 +339,6 @@ static void radeonTexParameter( struct gl_context *ctx, 
GLenum target,
               _mesa_lookup_enum_by_nr( pname ) );

     switch ( pname ) {
-   case GL_TEXTURE_MIN_FILTER:
-   case GL_TEXTURE_MAG_FILTER:
-   case GL_TEXTURE_MAX_ANISOTROPY_EXT:
-      radeonSetTexMaxAnisotropy( t, texObj->Sampler.MaxAnisotropy );
-      radeonSetTexFilter( t, texObj->Sampler.MinFilter, 
texObj->Sampler.MagFilter );
-      break;
-
-   case GL_TEXTURE_WRAP_S:
-   case GL_TEXTURE_WRAP_T:
-      radeonSetTexWrap( t, texObj->Sampler.WrapS, texObj->Sampler.WrapT );
-      break;
-
-   case GL_TEXTURE_BORDER_COLOR:
-      radeonSetTexBorderColor( t, texObj->Sampler.BorderColor.f );
-      break;
-
     case GL_TEXTURE_BASE_LEVEL:
     case GL_TEXTURE_MAX_LEVEL:
     case GL_TEXTURE_MIN_LOD:
@@ -433,6 +428,16 @@ radeonNewTextureObject( struct gl_context *ctx, GLuint 
name, GLenum target )
  }


+static struct gl_sampler_object *
+radeonNewSamplerObject(struct gl_context *ctx, GLuint name)
+{
+   r100ContextPtr rmesa = R100_CONTEXT(ctx);
+   struct gl_sampler_object *samp = _mesa_new_sampler_object(ctx, name);
+   if (samp)
+      samp->MaxAnisotropy = rmesa->radeon.initialMaxAnisotropy;
+   return samp;
+}
+

  void radeonInitTextureFuncs( radeonContextPtr radeon, struct 
dd_function_table *functions )
  {
@@ -445,4 +450,5 @@ void radeonInitTextureFuncs( radeonContextPtr radeon, 
struct dd_function_table *
     functions->TexEnv                       = radeonTexEnv;
     functions->TexParameter         = radeonTexParameter;
     functions->TexGen                       = radeonTexGen;
+   functions->NewSamplerObject              = radeonNewSamplerObject;
  }
diff --git a/src/mesa/drivers/dri/radeon/radeon_tex.h 
b/src/mesa/drivers/dri/radeon/radeon_tex.h
index 2f0fbe1..fa57c08 100644
--- a/src/mesa/drivers/dri/radeon/radeon_tex.h
+++ b/src/mesa/drivers/dri/radeon/radeon_tex.h
@@ -47,6 +47,7 @@ extern int radeonUploadTexImages( r100ContextPtr rmesa, 
radeonTexObjPtr t,
                                  GLuint face );

  extern void radeonDestroyTexObj( r100ContextPtr rmesa, radeonTexObjPtr t );
+extern void radeonTexUpdateParameters(struct gl_context *ctx, GLuint unit);

  extern void radeonInitTextureFuncs( radeonContextPtr radeon, struct 
dd_function_table *functions );

diff --git a/src/mesa/drivers/dri/radeon/radeon_tex_copy.c 
b/src/mesa/drivers/dri/radeon/radeon_tex_copy.c
index 1faf9c8..a6c406b 100644
--- a/src/mesa/drivers/dri/radeon/radeon_tex_copy.c
+++ b/src/mesa/drivers/dri/radeon/radeon_tex_copy.c
@@ -72,7 +72,7 @@ do_copy_texsubimage(struct gl_context *ctx,
      }

      if (!timg->mt) {
-        radeon_validate_texture_miptree(ctx,&tobj->base);
+        radeon_validate_texture_miptree(ctx,&tobj->base.Sampler,&tobj->base);
      }

      assert(rrb->bo);
diff --git a/src/mesa/drivers/dri/radeon/radeon_texstate.c 
b/src/mesa/drivers/dri/radeon/radeon_texstate.c
index 87f12d5..d2b5b75 100644
--- a/src/mesa/drivers/dri/radeon/radeon_texstate.c
+++ b/src/mesa/drivers/dri/radeon/radeon_texstate.c
@@ -42,6 +42,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 
SOFTWARE.
  #include "main/texstate.h"
  #include "main/texobj.h"
  #include "main/enums.h"
+#include "main/samplerobj.h"

  #include "radeon_context.h"
  #include "radeon_mipmap_tree.h"
@@ -1057,7 +1058,7 @@ static GLboolean radeon_validate_texture(struct 
gl_context *ctx, struct gl_textu
     radeonTexObj *t = radeon_tex_obj(texObj);
     int ret;

-   if (!radeon_validate_texture_miptree(ctx, texObj))
+   if (!radeon_validate_texture_miptree(ctx, _mesa_get_samplerobj(ctx, unit), 
texObj))
        return GL_FALSE;

     ret = setup_hardware_state(rmesa, t, unit);
@@ -1076,6 +1077,7 @@ static GLboolean radeon_validate_texture(struct 
gl_context *ctx, struct gl_textu

     rmesa->recheck_texgen[unit] = GL_TRUE;

+   radeonTexUpdateParameters(ctx, unit);
     import_tex_obj_state( rmesa, unit, t );

     if (rmesa->recheck_texgen[unit]) {
diff --git a/src/mesa/drivers/dri/radeon/radeon_texture.h 
b/src/mesa/drivers/dri/radeon/radeon_texture.h
index 8f9f5bd..abcce54 100644
--- a/src/mesa/drivers/dri/radeon/radeon_texture.h
+++ b/src/mesa/drivers/dri/radeon/radeon_texture.h
@@ -49,7 +49,9 @@ void radeonFreeTextureImageBuffer(struct gl_context *ctx, 
struct gl_texture_imag

  void radeon_teximage_map(radeon_texture_image *image, GLboolean write_enable);
  void radeon_teximage_unmap(radeon_texture_image *image);
-int radeon_validate_texture_miptree(struct gl_context * ctx, struct 
gl_texture_object *texObj);
+int radeon_validate_texture_miptree(struct gl_context * ctx,
+                                   struct gl_sampler_object *samp,
+                                   struct gl_texture_object *texObj);


  void radeon_swrast_map_texture_images(struct gl_context *ctx, struct 
gl_texture_object *texObj);

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to