r600g: add texture border state.
[mesa.git] / src / gallium / drivers / r600 / r600_state_inlines.h
index b45089dcc18e4232f02d783bb8859f56b2f06aaf..b4c21d9e12647e563c88c27c9290f7a93210be2d 100644 (file)
@@ -110,7 +110,7 @@ static INLINE uint32_t r600_translate_stencil_op(int s_op)
        case PIPE_STENCIL_OP_DECR:
                return V_028800_STENCIL_DECR;
        case PIPE_STENCIL_OP_INCR_WRAP:
-               return V_028800_STENCIL_INVERT;
+               return V_028800_STENCIL_INCR_WRAP;
        case PIPE_STENCIL_OP_DECR_WRAP:
                return V_028800_STENCIL_DECR_WRAP;
        case PIPE_STENCIL_OP_INVERT:
@@ -129,138 +129,290 @@ static INLINE uint32_t r600_translate_ds_func(int func)
        return func;
 }
 
-static uint32_t r600_translate_colorswap(enum pipe_format format)
+static inline unsigned r600_tex_wrap(unsigned wrap)
+{
+       switch (wrap) {
+       default:
+       case PIPE_TEX_WRAP_REPEAT:
+               return V_03C000_SQ_TEX_WRAP;
+       case PIPE_TEX_WRAP_CLAMP:
+               return V_03C000_SQ_TEX_CLAMP_LAST_TEXEL;
+       case PIPE_TEX_WRAP_CLAMP_TO_EDGE:
+               return V_03C000_SQ_TEX_CLAMP_HALF_BORDER;
+       case PIPE_TEX_WRAP_CLAMP_TO_BORDER:
+               return V_03C000_SQ_TEX_CLAMP_BORDER;
+       case PIPE_TEX_WRAP_MIRROR_REPEAT:
+               return V_03C000_SQ_TEX_MIRROR;
+       case PIPE_TEX_WRAP_MIRROR_CLAMP:
+               return V_03C000_SQ_TEX_MIRROR_ONCE_LAST_TEXEL;
+       case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE:
+               return V_03C000_SQ_TEX_MIRROR_ONCE_HALF_BORDER;
+       case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER:
+               return V_03C000_SQ_TEX_MIRROR_ONCE_BORDER;
+       }
+}
+
+static inline unsigned r600_tex_filter(unsigned filter)
+{
+       switch (filter) {
+       default:
+       case PIPE_TEX_FILTER_NEAREST:
+               return V_03C000_SQ_TEX_XY_FILTER_POINT;
+       case PIPE_TEX_FILTER_LINEAR:
+               return V_03C000_SQ_TEX_XY_FILTER_BILINEAR;
+       }
+}
+
+static inline unsigned r600_tex_mipfilter(unsigned filter)
+{
+       switch (filter) {
+       case PIPE_TEX_MIPFILTER_NEAREST:
+               return V_03C000_SQ_TEX_Z_FILTER_POINT;
+       case PIPE_TEX_MIPFILTER_LINEAR:
+               return V_03C000_SQ_TEX_Z_FILTER_LINEAR;
+       default:
+       case PIPE_TEX_MIPFILTER_NONE:
+               return V_03C000_SQ_TEX_Z_FILTER_NONE;
+       }
+}
+
+static inline unsigned r600_tex_compare(unsigned compare)
+{
+       switch (compare) {
+       default:
+       case PIPE_FUNC_NEVER:
+               return V_03C000_SQ_TEX_DEPTH_COMPARE_NEVER;
+       case PIPE_FUNC_LESS:
+               return V_03C000_SQ_TEX_DEPTH_COMPARE_LESS;
+       case PIPE_FUNC_EQUAL:
+               return V_03C000_SQ_TEX_DEPTH_COMPARE_EQUAL;
+       case PIPE_FUNC_LEQUAL:
+               return V_03C000_SQ_TEX_DEPTH_COMPARE_LESSEQUAL;
+       case PIPE_FUNC_GREATER:
+               return V_03C000_SQ_TEX_DEPTH_COMPARE_GREATER;
+       case PIPE_FUNC_NOTEQUAL:
+               return V_03C000_SQ_TEX_DEPTH_COMPARE_NOTEQUAL;
+       case PIPE_FUNC_GEQUAL:
+               return V_03C000_SQ_TEX_DEPTH_COMPARE_GREATEREQUAL;
+       case PIPE_FUNC_ALWAYS:
+               return V_03C000_SQ_TEX_DEPTH_COMPARE_ALWAYS;
+       }
+}
+
+static inline unsigned r600_tex_swizzle(unsigned swizzle)
+{
+       switch (swizzle) {
+       case PIPE_SWIZZLE_RED:
+               return V_038010_SQ_SEL_X;
+       case PIPE_SWIZZLE_GREEN:
+               return V_038010_SQ_SEL_Y;
+       case PIPE_SWIZZLE_BLUE:
+               return V_038010_SQ_SEL_Z;
+       case PIPE_SWIZZLE_ALPHA:
+               return V_038010_SQ_SEL_W;
+       case PIPE_SWIZZLE_ZERO:
+               return V_038010_SQ_SEL_0;
+       default:
+       case PIPE_SWIZZLE_ONE:
+               return V_038010_SQ_SEL_1;
+       }
+}
+
+static inline unsigned r600_format_type(unsigned format_type)
+{
+       switch (format_type) {
+       default:
+       case UTIL_FORMAT_TYPE_UNSIGNED:
+               return V_038010_SQ_FORMAT_COMP_UNSIGNED;
+       case UTIL_FORMAT_TYPE_SIGNED:
+               return V_038010_SQ_FORMAT_COMP_SIGNED;
+       case UTIL_FORMAT_TYPE_FIXED:
+               return V_038010_SQ_FORMAT_COMP_UNSIGNED_BIASED;
+       }
+}
+
+static inline unsigned r600_tex_dim(unsigned dim)
+{
+       switch (dim) {
+       default:
+       case PIPE_TEXTURE_1D:
+               return V_038000_SQ_TEX_DIM_1D;
+       case PIPE_TEXTURE_2D:
+       case PIPE_TEXTURE_RECT:
+               return V_038000_SQ_TEX_DIM_2D;
+       case PIPE_TEXTURE_3D:
+               return V_038000_SQ_TEX_DIM_3D;
+       case PIPE_TEXTURE_CUBE:
+               return V_038000_SQ_TEX_DIM_CUBEMAP;
+       }
+}
+
+static inline uint32_t r600_translate_dbformat(enum pipe_format format)
+{
+       switch (format) {
+       case PIPE_FORMAT_Z16_UNORM:
+               return V_028010_DEPTH_16;
+       case PIPE_FORMAT_Z24X8_UNORM:
+               return V_028010_DEPTH_X8_24;
+       case PIPE_FORMAT_Z24_UNORM_S8_USCALED:
+               return V_028010_DEPTH_8_24;
+       default:
+               return ~0;
+       }
+}
+
+static inline uint32_t r600_translate_colorswap(enum pipe_format format)
 {
        switch (format) {
                /* 8-bit buffers. */
-        case PIPE_FORMAT_A8_UNORM:
-        case PIPE_FORMAT_I8_UNORM:
-        case PIPE_FORMAT_L8_UNORM:
-        case PIPE_FORMAT_R8_UNORM:
-        case PIPE_FORMAT_R8_SNORM:
-               return SWAP_STD;
+       case PIPE_FORMAT_A8_UNORM:
+       case PIPE_FORMAT_I8_UNORM:
+       case PIPE_FORMAT_L8_UNORM:
+       case PIPE_FORMAT_R8_UNORM:
+       case PIPE_FORMAT_R8_SNORM:
+               return V_0280A0_SWAP_STD;
 
                /* 16-bit buffers. */
-        case PIPE_FORMAT_B5G6R5_UNORM:
-               return SWAP_STD_REV;
+       case PIPE_FORMAT_B5G6R5_UNORM:
+               return V_0280A0_SWAP_STD_REV;
 
-        case PIPE_FORMAT_B5G5R5A1_UNORM:
-        case PIPE_FORMAT_B5G5R5X1_UNORM:
-               return SWAP_ALT;
+       case PIPE_FORMAT_B5G5R5A1_UNORM:
+       case PIPE_FORMAT_B5G5R5X1_UNORM:
+               return V_0280A0_SWAP_ALT;
 
-        case PIPE_FORMAT_B4G4R4A4_UNORM:
-        case PIPE_FORMAT_B4G4R4X4_UNORM:
-               return SWAP_ALT;
+       case PIPE_FORMAT_B4G4R4A4_UNORM:
+       case PIPE_FORMAT_B4G4R4X4_UNORM:
+               return V_0280A0_SWAP_ALT;
                /* 32-bit buffers. */
-        case PIPE_FORMAT_B8G8R8A8_UNORM:
-        case PIPE_FORMAT_B8G8R8X8_UNORM:
-               return SWAP_ALT;
-
-        case PIPE_FORMAT_A8R8G8B8_UNORM:
-        case PIPE_FORMAT_X8R8G8B8_UNORM:
-               return SWAP_ALT_REV;
-        case PIPE_FORMAT_R8G8B8A8_SNORM:
-        case PIPE_FORMAT_R8G8B8X8_UNORM:
-               return SWAP_STD;
-
-        case PIPE_FORMAT_A8B8G8R8_UNORM:
-        case PIPE_FORMAT_X8B8G8R8_UNORM:
-//        case PIPE_FORMAT_R8SG8SB8UX8U_NORM:
-               return SWAP_STD_REV;
-
-        case PIPE_FORMAT_R10G10B10A2_UNORM:
-        case PIPE_FORMAT_R10G10B10X2_SNORM:
-        case PIPE_FORMAT_B10G10R10A2_UNORM:
-        case PIPE_FORMAT_R10SG10SB10SA2U_NORM:
-               return SWAP_STD_REV;
+
+       case PIPE_FORMAT_A8B8G8R8_SRGB:
+               return V_0280A0_SWAP_STD_REV;
+       case PIPE_FORMAT_B8G8R8A8_SRGB:
+               return V_0280A0_SWAP_ALT;
+
+       case PIPE_FORMAT_B8G8R8A8_UNORM:
+       case PIPE_FORMAT_B8G8R8X8_UNORM:
+               return V_0280A0_SWAP_ALT;
+
+       case PIPE_FORMAT_A8R8G8B8_UNORM:
+       case PIPE_FORMAT_X8R8G8B8_UNORM:
+               return V_0280A0_SWAP_ALT_REV;
+       case PIPE_FORMAT_R8G8B8A8_SNORM:
+       case PIPE_FORMAT_R8G8B8X8_UNORM:
+               return V_0280A0_SWAP_STD;
+
+       case PIPE_FORMAT_A8B8G8R8_UNORM:
+       case PIPE_FORMAT_X8B8G8R8_UNORM:
+               //        case PIPE_FORMAT_R8SG8SB8UX8U_NORM:
+               return V_0280A0_SWAP_STD_REV;
+
+       case PIPE_FORMAT_Z24X8_UNORM:
+       case PIPE_FORMAT_Z24_UNORM_S8_USCALED:
+               return V_0280A0_SWAP_STD;
+
+       case PIPE_FORMAT_R10G10B10A2_UNORM:
+       case PIPE_FORMAT_R10G10B10X2_SNORM:
+       case PIPE_FORMAT_B10G10R10A2_UNORM:
+       case PIPE_FORMAT_R10SG10SB10SA2U_NORM:
+               return V_0280A0_SWAP_STD_REV;
 
                /* 64-bit buffers. */
-        case PIPE_FORMAT_R16G16B16A16_UNORM:
-        case PIPE_FORMAT_R16G16B16A16_SNORM:
-//             return V_0280A0_COLOR_16_16_16_16;
-        case PIPE_FORMAT_R16G16B16A16_FLOAT:
-//             return V_0280A0_COLOR_16_16_16_16_FLOAT;
+       case PIPE_FORMAT_R16G16B16A16_UNORM:
+       case PIPE_FORMAT_R16G16B16A16_SNORM:
+               //              return V_0280A0_COLOR_16_16_16_16;
+       case PIPE_FORMAT_R16G16B16A16_FLOAT:
+               //              return V_0280A0_COLOR_16_16_16_16_FLOAT;
 
                /* 128-bit buffers. */
-        case PIPE_FORMAT_R32G32B32A32_FLOAT:
-//             return V_0280A0_COLOR_32_32_32_32_FLOAT;
+       case PIPE_FORMAT_R32G32B32A32_FLOAT:
+               //              return V_0280A0_COLOR_32_32_32_32_FLOAT;
                return 0;
        default:
                R600_ERR("unsupported colorswap format %d\n", format);
                return ~0;
        }
        return ~0;
-
 }
 
 static INLINE uint32_t r600_translate_colorformat(enum pipe_format format)
 {
        switch (format) {
                /* 8-bit buffers. */
-        case PIPE_FORMAT_A8_UNORM:
-        case PIPE_FORMAT_I8_UNORM:
-        case PIPE_FORMAT_L8_UNORM:
-        case PIPE_FORMAT_R8_UNORM:
-        case PIPE_FORMAT_R8_SNORM:
+       case PIPE_FORMAT_A8_UNORM:
+       case PIPE_FORMAT_I8_UNORM:
+       case PIPE_FORMAT_L8_UNORM:
+       case PIPE_FORMAT_R8_UNORM:
+       case PIPE_FORMAT_R8_SNORM:
                return V_0280A0_COLOR_8;
 
                /* 16-bit buffers. */
-        case PIPE_FORMAT_B5G6R5_UNORM:
+       case PIPE_FORMAT_B5G6R5_UNORM:
                return V_0280A0_COLOR_5_6_5;
 
-        case PIPE_FORMAT_B5G5R5A1_UNORM:
-        case PIPE_FORMAT_B5G5R5X1_UNORM:
+       case PIPE_FORMAT_B5G5R5A1_UNORM:
+       case PIPE_FORMAT_B5G5R5X1_UNORM:
                return V_0280A0_COLOR_1_5_5_5;
 
-        case PIPE_FORMAT_B4G4R4A4_UNORM:
-        case PIPE_FORMAT_B4G4R4X4_UNORM:
+       case PIPE_FORMAT_B4G4R4A4_UNORM:
+       case PIPE_FORMAT_B4G4R4X4_UNORM:
                return V_0280A0_COLOR_4_4_4_4;
 
                /* 32-bit buffers. */
-        case PIPE_FORMAT_B8G8R8A8_UNORM:
-        case PIPE_FORMAT_B8G8R8X8_UNORM:
-        case PIPE_FORMAT_A8R8G8B8_UNORM:
-        case PIPE_FORMAT_X8R8G8B8_UNORM:
-        case PIPE_FORMAT_A8B8G8R8_UNORM:
-        case PIPE_FORMAT_R8G8B8A8_SNORM:
-        case PIPE_FORMAT_X8B8G8R8_UNORM:
-        case PIPE_FORMAT_R8G8B8X8_UNORM:
-        case PIPE_FORMAT_R8SG8SB8UX8U_NORM:
+       case PIPE_FORMAT_A8B8G8R8_SRGB:
+       case PIPE_FORMAT_A8B8G8R8_UNORM:
+       case PIPE_FORMAT_A8R8G8B8_UNORM:
+       case PIPE_FORMAT_B8G8R8A8_SRGB:
+       case PIPE_FORMAT_B8G8R8A8_UNORM:
+       case PIPE_FORMAT_B8G8R8X8_UNORM:
+       case PIPE_FORMAT_R8G8B8A8_SNORM:
+       case PIPE_FORMAT_R8G8B8A8_UNORM:
+       case PIPE_FORMAT_R8G8B8X8_UNORM:
+       case PIPE_FORMAT_R8SG8SB8UX8U_NORM:
+       case PIPE_FORMAT_X8B8G8R8_UNORM:
+       case PIPE_FORMAT_X8R8G8B8_UNORM:
+       case PIPE_FORMAT_R8G8B8_UNORM:
                return V_0280A0_COLOR_8_8_8_8;
 
-        case PIPE_FORMAT_R10G10B10A2_UNORM:
-        case PIPE_FORMAT_R10G10B10X2_SNORM:
-        case PIPE_FORMAT_B10G10R10A2_UNORM:
-        case PIPE_FORMAT_R10SG10SB10SA2U_NORM:
+       case PIPE_FORMAT_R10G10B10A2_UNORM:
+       case PIPE_FORMAT_R10G10B10X2_SNORM:
+       case PIPE_FORMAT_B10G10R10A2_UNORM:
+       case PIPE_FORMAT_R10SG10SB10SA2U_NORM:
                return V_0280A0_COLOR_10_10_10_2;
 
+       case PIPE_FORMAT_Z24X8_UNORM:
+       case PIPE_FORMAT_Z24_UNORM_S8_USCALED:
+               return V_0280A0_COLOR_8_24;
+
+       case PIPE_FORMAT_R32_FLOAT:
+               return V_0280A0_COLOR_32_FLOAT;
+
                /* 64-bit buffers. */
-        case PIPE_FORMAT_R16G16B16A16_UNORM:
-        case PIPE_FORMAT_R16G16B16A16_SNORM:
+       case PIPE_FORMAT_R16G16B16A16_UNORM:
+       case PIPE_FORMAT_R16G16B16A16_SNORM:
                return V_0280A0_COLOR_16_16_16_16;
-        case PIPE_FORMAT_R16G16B16A16_FLOAT:
+       case PIPE_FORMAT_R16G16B16A16_FLOAT:
                return V_0280A0_COLOR_16_16_16_16_FLOAT;
-        case PIPE_FORMAT_R32G32_FLOAT:
+       case PIPE_FORMAT_R32G32_FLOAT:
                return V_0280A0_COLOR_32_32_FLOAT;
 
                /* 128-bit buffers. */
-        case PIPE_FORMAT_R32G32B32_FLOAT:
-        case PIPE_FORMAT_R32G32B32A32_FLOAT:
+       case PIPE_FORMAT_R32G32B32_FLOAT:
+               return V_0280A0_COLOR_32_32_32_FLOAT;
+       case PIPE_FORMAT_R32G32B32A32_FLOAT:
                return V_0280A0_COLOR_32_32_32_32_FLOAT;
 
                /* YUV buffers. */
-        case PIPE_FORMAT_UYVY:
-//             return R300_COLOR_FORMAT_YVYU;
-        case PIPE_FORMAT_YUYV:
-//             return R300_COLOR_FORMAT_VYUY;
-        default:
+       case PIPE_FORMAT_UYVY:
+       case PIPE_FORMAT_YUYV:
+       default:
+               R600_ERR("unsupported color format %d\n", format);
                return ~0; /* Unsupported. */
        }
 }
 
 static INLINE boolean r600_is_sampler_format_supported(enum pipe_format format)
 {
-       return r600_translate_colorformat(format) != ~0;
+       return r600_translate_texformat(format, NULL, NULL, NULL) != ~0;
 }
 
 static INLINE boolean r600_is_colorbuffer_format_supported(enum pipe_format format)
@@ -271,7 +423,7 @@ static INLINE boolean r600_is_colorbuffer_format_supported(enum pipe_format form
 
 static INLINE boolean r600_is_zs_format_supported(enum pipe_format format)
 {
-       return TRUE;
+       return r600_translate_dbformat(format) != ~0;
 }
 
 static INLINE boolean r600_is_vertex_format_supported(enum pipe_format format)