Merge remote branch 'origin/mesa_7_6_branch'
[mesa.git] / src / mesa / drivers / dri / r600 / r600_tex.c
index 70bf6c4b948b931e65954307899c596a4ab64b71..d105b90cd18562bdb2b46ea77556dec3b80c8eb6 100644 (file)
@@ -48,8 +48,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "texmem.h"
 
 #include "r600_context.h"
-#include "r600_state.h"
-#include "r600_ioctl.h"
+#include "r700_state.h"
 #include "radeon_mipmap_tree.h"
 #include "r600_tex.h"
 
@@ -59,16 +58,16 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 static unsigned int translate_wrap_mode(GLenum wrapmode)
 {
        switch(wrapmode) {
-       case GL_REPEAT: return R300_TX_REPEAT;
-       case GL_CLAMP: return R300_TX_CLAMP;
-       case GL_CLAMP_TO_EDGE: return R300_TX_CLAMP_TO_EDGE;
-       case GL_CLAMP_TO_BORDER: return R300_TX_CLAMP_TO_BORDER;
-       case GL_MIRRORED_REPEAT: return R300_TX_REPEAT | R300_TX_MIRRORED;
-       case GL_MIRROR_CLAMP_EXT: return R300_TX_CLAMP | R300_TX_MIRRORED;
-       case GL_MIRROR_CLAMP_TO_EDGE_EXT: return R300_TX_CLAMP_TO_EDGE | R300_TX_MIRRORED;
-       case GL_MIRROR_CLAMP_TO_BORDER_EXT: return R300_TX_CLAMP_TO_BORDER | R300_TX_MIRRORED;
+       case GL_REPEAT: return SQ_TEX_WRAP;
+       case GL_CLAMP: return SQ_TEX_CLAMP_HALF_BORDER;
+       case GL_CLAMP_TO_EDGE: return SQ_TEX_CLAMP_LAST_TEXEL;
+       case GL_CLAMP_TO_BORDER: return SQ_TEX_CLAMP_BORDER;
+       case GL_MIRRORED_REPEAT: return SQ_TEX_MIRROR;
+       case GL_MIRROR_CLAMP_EXT: return SQ_TEX_MIRROR_ONCE_HALF_BORDER;
+       case GL_MIRROR_CLAMP_TO_EDGE_EXT: return SQ_TEX_MIRROR_ONCE_LAST_TEXEL;
+       case GL_MIRROR_CLAMP_TO_BORDER_EXT: return SQ_TEX_MIRROR_ONCE_BORDER;
        default:
-               _mesa_problem(NULL, "bad wrap mode in %s", __FUNCTION__);
+               radeon_error("bad wrap mode in %s", __FUNCTION__);
                return 0;
        }
 }
@@ -79,23 +78,96 @@ static unsigned int translate_wrap_mode(GLenum wrapmode)
  *
  * \param t Texture object whose wrap modes are to be set
  */
-static void r300UpdateTexWrap(radeonTexObjPtr t)
+static void r600UpdateTexWrap(radeonTexObjPtr t)
 {
        struct gl_texture_object *tObj = &t->base;
 
-       t->pp_txfilter &=
-           ~(R300_TX_WRAP_S_MASK | R300_TX_WRAP_T_MASK | R300_TX_WRAP_R_MASK);
-
-       t->pp_txfilter |= translate_wrap_mode(tObj->WrapS) << R300_TX_WRAP_S_SHIFT;
+        SETfield(t->SQ_TEX_SAMPLER0, translate_wrap_mode(tObj->WrapS),
+                 SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_shift, SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_mask);
 
        if (tObj->Target != GL_TEXTURE_1D) {
-               t->pp_txfilter |= translate_wrap_mode(tObj->WrapT) << R300_TX_WRAP_T_SHIFT;
+               SETfield(t->SQ_TEX_SAMPLER0, translate_wrap_mode(tObj->WrapT),
+                        CLAMP_Y_shift, CLAMP_Y_mask);
 
                if (tObj->Target == GL_TEXTURE_3D)
-                       t->pp_txfilter |= translate_wrap_mode(tObj->WrapR) << R300_TX_WRAP_R_SHIFT;
+                       SETfield(t->SQ_TEX_SAMPLER0, translate_wrap_mode(tObj->WrapR),
+                                CLAMP_Z_shift, CLAMP_Z_mask);
        }
 }
 
+static void r600SetTexDefaultState(radeonTexObjPtr t)
+{
+        /* Init text object to default states. */
+        t->SQ_TEX_RESOURCE0              = 0;
+        SETfield(t->SQ_TEX_RESOURCE0, SQ_TEX_DIM_2D, DIM_shift, DIM_mask);
+        SETfield(t->SQ_TEX_RESOURCE0, ARRAY_LINEAR_GENERAL,
+                 SQ_TEX_RESOURCE_WORD0_0__TILE_MODE_shift, SQ_TEX_RESOURCE_WORD0_0__TILE_MODE_mask);
+        CLEARbit(t->SQ_TEX_RESOURCE0, TILE_TYPE_bit);
+
+        t->SQ_TEX_RESOURCE1                = 0;
+        SETfield(t->SQ_TEX_RESOURCE1, FMT_8_8_8_8,
+                 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
+
+        t->SQ_TEX_RESOURCE2                = 0;
+        t->SQ_TEX_RESOURCE3                = 0;
+
+        t->SQ_TEX_RESOURCE4                   = 0;
+        SETfield(t->SQ_TEX_RESOURCE4, SQ_FORMAT_COMP_UNSIGNED,
+                 FORMAT_COMP_X_shift, FORMAT_COMP_X_mask);
+        SETfield(t->SQ_TEX_RESOURCE4, SQ_FORMAT_COMP_UNSIGNED,
+                 FORMAT_COMP_Y_shift, FORMAT_COMP_Y_mask);
+        SETfield(t->SQ_TEX_RESOURCE4, SQ_FORMAT_COMP_UNSIGNED,
+                 FORMAT_COMP_Z_shift, FORMAT_COMP_Z_mask);
+        SETfield(t->SQ_TEX_RESOURCE4, SQ_FORMAT_COMP_UNSIGNED,
+                 FORMAT_COMP_W_shift, FORMAT_COMP_W_mask);
+        SETfield(t->SQ_TEX_RESOURCE4, SQ_NUM_FORMAT_NORM,
+                 SQ_TEX_RESOURCE_WORD4_0__NUM_FORMAT_ALL_shift, SQ_TEX_RESOURCE_WORD4_0__NUM_FORMAT_ALL_mask);
+        CLEARbit(t->SQ_TEX_RESOURCE4, SQ_TEX_RESOURCE_WORD4_0__SRF_MODE_ALL_bit);
+        CLEARbit(t->SQ_TEX_RESOURCE4, SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit);
+        SETfield(t->SQ_TEX_RESOURCE4, SQ_ENDIAN_NONE,
+                 SQ_TEX_RESOURCE_WORD4_0__ENDIAN_SWAP_shift, SQ_TEX_RESOURCE_WORD4_0__ENDIAN_SWAP_mask);
+        SETfield(t->SQ_TEX_RESOURCE4, 1, REQUEST_SIZE_shift, REQUEST_SIZE_mask);
+        SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift,
+                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+       SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
+                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift,
+                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+       SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
+                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift,
+                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+       SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
+                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift,
+                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
+        SETfield(t->SQ_TEX_RESOURCE4, 0, BASE_LEVEL_shift, BASE_LEVEL_mask); /* mip-maps */
+
+        t->SQ_TEX_RESOURCE5 = 0;
+        t->SQ_TEX_RESOURCE6 = 0;
+
+        SETfield(t->SQ_TEX_RESOURCE6, SQ_TEX_VTX_VALID_TEXTURE,
+                 SQ_TEX_RESOURCE_WORD6_0__TYPE_shift, SQ_TEX_RESOURCE_WORD6_0__TYPE_mask);
+
+        /* Initialize sampler registers */
+        t->SQ_TEX_SAMPLER0                           = 0;
+        SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_WRAP, SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_shift,
+                SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_mask);
+        SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_WRAP, CLAMP_Y_shift, CLAMP_Y_mask);
+        SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_WRAP, CLAMP_Z_shift, CLAMP_Z_mask);
+        SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_XY_FILTER_POINT, XY_MAG_FILTER_shift, XY_MAG_FILTER_mask);
+        SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_XY_FILTER_POINT, XY_MIN_FILTER_shift, XY_MIN_FILTER_mask);
+        SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_Z_FILTER_NONE, Z_FILTER_shift, Z_FILTER_mask);
+        SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_Z_FILTER_NONE, MIP_FILTER_shift, MIP_FILTER_mask);
+        SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_BORDER_COLOR_TRANS_BLACK, BORDER_COLOR_TYPE_shift, BORDER_COLOR_TYPE_mask);
+
+        t->SQ_TEX_SAMPLER1                           = 0;
+        SETfield(t->SQ_TEX_SAMPLER1, 0x3ff, MAX_LOD_shift, MAX_LOD_mask);
+
+        t->SQ_TEX_SAMPLER2                          = 0;
+        SETbit(t->SQ_TEX_SAMPLER2, SQ_TEX_SAMPLER_WORD2_0__TYPE_bit);
+}
+
+
+#if 0
 static GLuint aniso_filter(GLfloat anisotropy)
 {
        if (anisotropy >= 16.0) {
@@ -109,7 +181,9 @@ static GLuint aniso_filter(GLfloat anisotropy)
        } else {
                return R300_TX_MAX_ANISO_1_TO_1;
        }
+       return 0;
 }
+#endif
 
 /**
  * Set the texture magnification and minification modes.
@@ -119,47 +193,61 @@ static GLuint aniso_filter(GLfloat anisotropy)
  * \param magf Texture magnification mode
  * \param anisotropy Maximum anisotropy level
  */
-static void r300SetTexFilter(radeonTexObjPtr t, GLenum minf, GLenum magf, GLfloat anisotropy)
+static void r600SetTexFilter(radeonTexObjPtr t, GLenum minf, GLenum magf, GLfloat anisotropy)
 {
        /* Force revalidation to account for switches from/to mipmapping. */
        t->validated = GL_FALSE;
 
-       t->pp_txfilter &= ~(R300_TX_MIN_FILTER_MASK | R300_TX_MIN_FILTER_MIP_MASK | R300_TX_MAG_FILTER_MASK | R300_TX_MAX_ANISO_MASK);
-       t->pp_txfilter_1 &= ~R300_EDGE_ANISO_EDGE_ONLY;
-
        /* Note that EXT_texture_filter_anisotropic is extremely vague about
         * how anisotropic filtering interacts with the "normal" filter modes.
         * When anisotropic filtering is enabled, we override min and mag
         * filter settings completely. This includes driconf's settings.
         */
        if (anisotropy >= 2.0 && (minf != GL_NEAREST) && (magf != GL_NEAREST)) {
-               t->pp_txfilter |= R300_TX_MAG_FILTER_ANISO
+               /*t->pp_txfilter |= R300_TX_MAG_FILTER_ANISO
                        | R300_TX_MIN_FILTER_ANISO
                        | R300_TX_MIN_FILTER_MIP_LINEAR
-                       | aniso_filter(anisotropy);
-               if (RADEON_DEBUG & DEBUG_TEXTURE)
-                       fprintf(stderr, "Using maximum anisotropy of %f\n", anisotropy);
+                       | aniso_filter(anisotropy);*/
+               radeon_print(RADEON_TEXTURE, RADEON_NORMAL, "Using maximum anisotropy of %f\n", anisotropy);
                return;
        }
 
        switch (minf) {
        case GL_NEAREST:
-               t->pp_txfilter |= R300_TX_MIN_FILTER_NEAREST;
+               SETfield(t->SQ_TEX_SAMPLER0, TEX_XYFilter_Point,
+                        XY_MIN_FILTER_shift, XY_MIN_FILTER_mask);
+               SETfield(t->SQ_TEX_SAMPLER0, TEX_MipFilter_None,
+                        MIP_FILTER_shift, MIP_FILTER_mask);
                break;
        case GL_LINEAR:
-               t->pp_txfilter |= R300_TX_MIN_FILTER_LINEAR;
+               SETfield(t->SQ_TEX_SAMPLER0, TEX_XYFilter_Linear,
+                        XY_MIN_FILTER_shift, XY_MIN_FILTER_mask);
+               SETfield(t->SQ_TEX_SAMPLER0, TEX_MipFilter_None,
+                        MIP_FILTER_shift, MIP_FILTER_mask);
                break;
        case GL_NEAREST_MIPMAP_NEAREST:
-               t->pp_txfilter |= R300_TX_MIN_FILTER_NEAREST|R300_TX_MIN_FILTER_MIP_NEAREST;
+               SETfield(t->SQ_TEX_SAMPLER0, TEX_XYFilter_Point,
+                        XY_MIN_FILTER_shift, XY_MIN_FILTER_mask);
+               SETfield(t->SQ_TEX_SAMPLER0, TEX_MipFilter_Point,
+                        MIP_FILTER_shift, MIP_FILTER_mask);
                break;
        case GL_NEAREST_MIPMAP_LINEAR:
-               t->pp_txfilter |= R300_TX_MIN_FILTER_NEAREST|R300_TX_MIN_FILTER_MIP_LINEAR;
+               SETfield(t->SQ_TEX_SAMPLER0, TEX_XYFilter_Point,
+                        XY_MIN_FILTER_shift, XY_MIN_FILTER_mask);
+               SETfield(t->SQ_TEX_SAMPLER0, TEX_MipFilter_Linear,
+                        MIP_FILTER_shift, MIP_FILTER_mask);
                break;
        case GL_LINEAR_MIPMAP_NEAREST:
-               t->pp_txfilter |= R300_TX_MIN_FILTER_LINEAR|R300_TX_MIN_FILTER_MIP_NEAREST;
+               SETfield(t->SQ_TEX_SAMPLER0, TEX_XYFilter_Linear,
+                        XY_MIN_FILTER_shift, XY_MIN_FILTER_mask);
+               SETfield(t->SQ_TEX_SAMPLER0, TEX_MipFilter_Point,
+                        MIP_FILTER_shift, MIP_FILTER_mask);
                break;
        case GL_LINEAR_MIPMAP_LINEAR:
-               t->pp_txfilter |= R300_TX_MIN_FILTER_LINEAR|R300_TX_MIN_FILTER_MIP_LINEAR;
+               SETfield(t->SQ_TEX_SAMPLER0, TEX_XYFilter_Linear,
+                        XY_MIN_FILTER_shift, XY_MIN_FILTER_mask);
+               SETfield(t->SQ_TEX_SAMPLER0, TEX_MipFilter_Linear,
+                        MIP_FILTER_shift, MIP_FILTER_mask);
                break;
        }
 
@@ -168,17 +256,24 @@ static void r300SetTexFilter(radeonTexObjPtr t, GLenum minf, GLenum magf, GLfloa
         */
        switch (magf) {
        case GL_NEAREST:
-               t->pp_txfilter |= R300_TX_MAG_FILTER_NEAREST;
+               SETfield(t->SQ_TEX_SAMPLER0, TEX_XYFilter_Point,
+                        XY_MAG_FILTER_shift, XY_MAG_FILTER_mask);
                break;
        case GL_LINEAR:
-               t->pp_txfilter |= R300_TX_MAG_FILTER_LINEAR;
+               SETfield(t->SQ_TEX_SAMPLER0, TEX_XYFilter_Linear,
+                        XY_MAG_FILTER_shift, XY_MAG_FILTER_mask);
                break;
        }
 }
 
-static void r300SetTexBorderColor(radeonTexObjPtr t, GLubyte c[4])
+static void r600SetTexBorderColor(radeonTexObjPtr t, const GLfloat color[4])
 {
-       t->pp_border_color = PACK_COLOR_8888(c[3], c[0], c[1], c[2]);
+       t->TD_PS_SAMPLER0_BORDER_ALPHA = *((uint32_t*)&(color[3]));
+       t->TD_PS_SAMPLER0_BORDER_RED = *((uint32_t*)&(color[2]));
+       t->TD_PS_SAMPLER0_BORDER_GREEN = *((uint32_t*)&(color[1]));
+       t->TD_PS_SAMPLER0_BORDER_BLUE = *((uint32_t*)&(color[0]));
+        SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_BORDER_COLOR_REGISTER,
+                BORDER_COLOR_TYPE_shift, BORDER_COLOR_TYPE_mask);
 }
 
 /**
@@ -186,32 +281,31 @@ static void r300SetTexBorderColor(radeonTexObjPtr t, GLubyte c[4])
  * next UpdateTextureState
  */
 
-static void r300TexParameter(GLcontext * ctx, GLenum target,
+static void r600TexParameter(GLcontext * ctx, GLenum target,
                             struct gl_texture_object *texObj,
                             GLenum pname, const GLfloat * params)
 {
        radeonTexObj* t = radeon_tex_obj(texObj);
 
-       if (RADEON_DEBUG & (DEBUG_STATE | DEBUG_TEXTURE)) {
-               fprintf(stderr, "%s( %s )\n", __FUNCTION__,
+       radeon_print(RADEON_STATE | RADEON_TEXTURE, RADEON_VERBOSE,
+                       "%s( %s )\n", __FUNCTION__,
                        _mesa_lookup_enum_by_nr(pname));
-       }
 
        switch (pname) {
        case GL_TEXTURE_MIN_FILTER:
        case GL_TEXTURE_MAG_FILTER:
        case GL_TEXTURE_MAX_ANISOTROPY_EXT:
-               r300SetTexFilter(t, texObj->MinFilter, texObj->MagFilter, texObj->MaxAnisotropy);
+               r600SetTexFilter(t, texObj->MinFilter, texObj->MagFilter, texObj->MaxAnisotropy);
                break;
 
        case GL_TEXTURE_WRAP_S:
        case GL_TEXTURE_WRAP_T:
        case GL_TEXTURE_WRAP_R:
-               r300UpdateTexWrap(t);
+               r600UpdateTexWrap(t);
                break;
 
        case GL_TEXTURE_BORDER_COLOR:
-               r300SetTexBorderColor(t, texObj->_BorderChan);
+               r600SetTexBorderColor(t, texObj->BorderColor);
                break;
 
        case GL_TEXTURE_BASE_LEVEL:
@@ -235,7 +329,7 @@ static void r300TexParameter(GLcontext * ctx, GLenum target,
                        return;
                if (texObj->Image[0][texObj->BaseLevel]->TexFormat->BaseFormat
                    == GL_DEPTH_COMPONENT) {
-                       r300SetDepthTexMode(texObj);
+                       r600SetDepthTexMode(texObj);
                        break;
                } else {
                        /* If the texture isn't a depth texture, changing this
@@ -250,22 +344,21 @@ static void r300TexParameter(GLcontext * ctx, GLenum target,
        }
 }
 
-static void r300DeleteTexture(GLcontext * ctx, struct gl_texture_object *texObj)
+static void r600DeleteTexture(GLcontext * ctx, struct gl_texture_object *texObj)
 {
-       r300ContextPtr rmesa = R300_CONTEXT(ctx);
+       context_t* rmesa = R700_CONTEXT(ctx);
        radeonTexObj* t = radeon_tex_obj(texObj);
 
-       if (RADEON_DEBUG & (DEBUG_STATE | DEBUG_TEXTURE)) {
-               fprintf(stderr, "%s( %p (target = %s) )\n", __FUNCTION__,
+       radeon_print(RADEON_STATE | RADEON_TEXTURE, RADEON_NORMAL,
+               "%s( %p (target = %s) )\n", __FUNCTION__,
                        (void *)texObj,
                        _mesa_lookup_enum_by_nr(texObj->Target));
-       }
 
        if (rmesa) {
                int i;
                radeon_firevertices(&rmesa->radeon);
 
-               for(i = 0; i < R300_MAX_TEXTURE_UNITS; ++i)
+               for(i = 0; i < R700_MAX_TEXTURE_UNITS; ++i)
                        if (rmesa->hw.textures[i] == t)
                                rmesa->hw.textures[i] = 0;
        }
@@ -289,31 +382,31 @@ static void r300DeleteTexture(GLcontext * ctx, struct gl_texture_object *texObj)
  * allocate the default texture objects.
  * Fixup MaxAnisotropy according to user preference.
  */
-static struct gl_texture_object *r300NewTextureObject(GLcontext * ctx,
+static struct gl_texture_object *r600NewTextureObject(GLcontext * ctx,
                                                      GLuint name,
                                                      GLenum target)
 {
-       r300ContextPtr rmesa = R300_CONTEXT(ctx);
+       context_t* rmesa = R700_CONTEXT(ctx);
        radeonTexObj* t = CALLOC_STRUCT(radeon_tex_obj);
 
 
-       if (RADEON_DEBUG & (DEBUG_STATE | DEBUG_TEXTURE)) {
-               fprintf(stderr, "%s( %p (target = %s) )\n", __FUNCTION__,
+       radeon_print(RADEON_STATE | RADEON_TEXTURE, RADEON_NORMAL,
+               "%s( %p (target = %s) )\n", __FUNCTION__,
                        t, _mesa_lookup_enum_by_nr(target));
-       }
 
        _mesa_initialize_texture_object(&t->base, name, target);
        t->base.MaxAnisotropy = rmesa->radeon.initialMaxAnisotropy;
 
        /* Initialize hardware state */
-       r300UpdateTexWrap(t);
-       r300SetTexFilter(t, t->base.MinFilter, t->base.MagFilter, t->base.MaxAnisotropy);
-       r300SetTexBorderColor(t, t->base._BorderChan);
+       r600SetTexDefaultState(t);
+       r600UpdateTexWrap(t);
+       r600SetTexFilter(t, t->base.MinFilter, t->base.MagFilter, t->base.MaxAnisotropy);
+       r600SetTexBorderColor(t, t->base.BorderColor);
 
        return &t->base;
 }
 
-void r300InitTextureFuncs(struct dd_function_table *functions)
+void r600InitTextureFuncs(struct dd_function_table *functions)
 {
        /* Note: we only plug in the functions we implement in the driver
         * since _mesa_init_driver_functions() was already called.
@@ -332,11 +425,11 @@ void r300InitTextureFuncs(struct dd_function_table *functions)
        functions->TexSubImage3D = radeonTexSubImage3D;
        functions->GetTexImage = radeonGetTexImage;
        functions->GetCompressedTexImage = radeonGetCompressedTexImage;
-       functions->NewTextureObject = r300NewTextureObject;
-       functions->DeleteTexture = r300DeleteTexture;
+       functions->NewTextureObject = r600NewTextureObject;
+       functions->DeleteTexture = r600DeleteTexture;
        functions->IsTextureResident = driIsTextureResident;
 
-       functions->TexParameter = r300TexParameter;
+       functions->TexParameter = r600TexParameter;
 
        functions->CompressedTexImage2D = radeonCompressedTexImage2D;
        functions->CompressedTexSubImage2D = radeonCompressedTexSubImage2D;