summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJerome Glisse <jglisse@redhat.com>2013-04-08 10:57:05 -0400
committerJerome Glisse <jglisse@redhat.com>2013-04-18 17:25:38 -0400
commitd0e9aaa31cb13404914aea292879739d4044f856 (patch)
tree32b850748af7544263713251f480be5e955a5654
parentdc21e30a6283629bed6db282caff0af13f3b88ec (diff)
radeonsi: add support for compressed texture v2
Most test pass, issue are with border color and swizzle. Based on ircnick<maelcum> patch. v2: Restaged commit hunk Signed-off-by: Jerome Glisse <jglisse@redhat.com>
-rw-r--r--src/gallium/drivers/radeonsi/si_state.c71
-rw-r--r--src/gallium/drivers/radeonsi/sid.h7
2 files changed, 76 insertions, 2 deletions
diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c
index 61ede6453f0..a39843ca356 100644
--- a/src/gallium/drivers/radeonsi/si_state.c
+++ b/src/gallium/drivers/radeonsi/si_state.c
@@ -30,6 +30,7 @@
30#include "util/u_helpers.h" 30#include "util/u_helpers.h"
31#include "util/u_math.h" 31#include "util/u_math.h"
32#include "util/u_pack_color.h" 32#include "util/u_pack_color.h"
33#include "util/u_format_s3tc.h"
33#include "tgsi/tgsi_parse.h" 34#include "tgsi/tgsi_parse.h"
34#include "radeonsi_pipe.h" 35#include "radeonsi_pipe.h"
35#include "radeonsi_shader.h" 36#include "radeonsi_shader.h"
@@ -1164,6 +1165,8 @@ static uint32_t si_translate_texformat(struct pipe_screen *screen,
1164 const struct util_format_description *desc, 1165 const struct util_format_description *desc,
1165 int first_non_void) 1166 int first_non_void)
1166{ 1167{
1168 struct r600_screen *rscreen = (struct r600_screen*)screen;
1169 bool enable_s3tc = rscreen->info.drm_minor >= 31;
1167 boolean uniform = TRUE; 1170 boolean uniform = TRUE;
1168 int i; 1171 int i;
1169 1172
@@ -1205,7 +1208,51 @@ static uint32_t si_translate_texformat(struct pipe_screen *screen,
1205 break; 1208 break;
1206 } 1209 }
1207 1210
1208 /* TODO compressed formats */ 1211 if (desc->layout == UTIL_FORMAT_LAYOUT_RGTC) {
1212 if (!enable_s3tc)
1213 goto out_unknown;
1214
1215 switch (format) {
1216 case PIPE_FORMAT_RGTC1_SNORM:
1217 case PIPE_FORMAT_LATC1_SNORM:
1218 case PIPE_FORMAT_RGTC1_UNORM:
1219 case PIPE_FORMAT_LATC1_UNORM:
1220 return V_008F14_IMG_DATA_FORMAT_BC4;
1221 case PIPE_FORMAT_RGTC2_SNORM:
1222 case PIPE_FORMAT_LATC2_SNORM:
1223 case PIPE_FORMAT_RGTC2_UNORM:
1224 case PIPE_FORMAT_LATC2_UNORM:
1225 return V_008F14_IMG_DATA_FORMAT_BC5;
1226 default:
1227 goto out_unknown;
1228 }
1229 }
1230
1231 if (desc->layout == UTIL_FORMAT_LAYOUT_S3TC) {
1232
1233 if (!enable_s3tc)
1234 goto out_unknown;
1235
1236 if (!util_format_s3tc_enabled) {
1237 goto out_unknown;
1238 }
1239
1240 switch (format) {
1241 case PIPE_FORMAT_DXT1_RGB:
1242 case PIPE_FORMAT_DXT1_RGBA:
1243 case PIPE_FORMAT_DXT1_SRGB:
1244 case PIPE_FORMAT_DXT1_SRGBA:
1245 return V_008F14_IMG_DATA_FORMAT_BC1;
1246 case PIPE_FORMAT_DXT3_RGBA:
1247 case PIPE_FORMAT_DXT3_SRGBA:
1248 return V_008F14_IMG_DATA_FORMAT_BC2;
1249 case PIPE_FORMAT_DXT5_RGBA:
1250 case PIPE_FORMAT_DXT5_SRGBA:
1251 return V_008F14_IMG_DATA_FORMAT_BC3;
1252 default:
1253 goto out_unknown;
1254 }
1255 }
1209 1256
1210 if (format == PIPE_FORMAT_R9G9B9E5_FLOAT) { 1257 if (format == PIPE_FORMAT_R9G9B9E5_FLOAT) {
1211 return V_008F14_IMG_DATA_FORMAT_5_9_9_9; 1258 return V_008F14_IMG_DATA_FORMAT_5_9_9_9;
@@ -2109,7 +2156,27 @@ static struct pipe_sampler_view *si_create_sampler_view(struct pipe_context *ctx
2109 break; 2156 break;
2110 default: 2157 default:
2111 if (first_non_void < 0) { 2158 if (first_non_void < 0) {
2112 num_format = V_008F14_IMG_NUM_FORMAT_FLOAT; 2159 if (util_format_is_compressed(pipe_format)) {
2160 switch (pipe_format) {
2161 case PIPE_FORMAT_DXT1_SRGB:
2162 case PIPE_FORMAT_DXT1_SRGBA:
2163 case PIPE_FORMAT_DXT3_SRGBA:
2164 case PIPE_FORMAT_DXT5_SRGBA:
2165 num_format = V_008F14_IMG_NUM_FORMAT_SRGB;
2166 break;
2167 case PIPE_FORMAT_RGTC1_SNORM:
2168 case PIPE_FORMAT_LATC1_SNORM:
2169 case PIPE_FORMAT_RGTC2_SNORM:
2170 case PIPE_FORMAT_LATC2_SNORM:
2171 num_format = V_008F14_IMG_NUM_FORMAT_SNORM;
2172 break;
2173 default:
2174 num_format = V_008F14_IMG_NUM_FORMAT_UNORM;
2175 break;
2176 }
2177 } else {
2178 num_format = V_008F14_IMG_NUM_FORMAT_FLOAT;
2179 }
2113 } else if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) { 2180 } else if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) {
2114 num_format = V_008F14_IMG_NUM_FORMAT_SRGB; 2181 num_format = V_008F14_IMG_NUM_FORMAT_SRGB;
2115 } else { 2182 } else {
diff --git a/src/gallium/drivers/radeonsi/sid.h b/src/gallium/drivers/radeonsi/sid.h
index 26b35e6b040..ca161df0502 100644
--- a/src/gallium/drivers/radeonsi/sid.h
+++ b/src/gallium/drivers/radeonsi/sid.h
@@ -3440,6 +3440,13 @@
3440#define V_008F14_IMG_DATA_FORMAT_GB_GR 0x20 3440#define V_008F14_IMG_DATA_FORMAT_GB_GR 0x20
3441#define V_008F14_IMG_DATA_FORMAT_BG_RG 0x21 3441#define V_008F14_IMG_DATA_FORMAT_BG_RG 0x21
3442#define V_008F14_IMG_DATA_FORMAT_5_9_9_9 0x22 3442#define V_008F14_IMG_DATA_FORMAT_5_9_9_9 0x22
3443#define V_008F14_IMG_DATA_FORMAT_BC1 0x23
3444#define V_008F14_IMG_DATA_FORMAT_BC2 0x24
3445#define V_008F14_IMG_DATA_FORMAT_BC3 0x25
3446#define V_008F14_IMG_DATA_FORMAT_BC4 0x26
3447#define V_008F14_IMG_DATA_FORMAT_BC5 0x27
3448#define V_008F14_IMG_DATA_FORMAT_BC6 0x28
3449#define V_008F14_IMG_DATA_FORMAT_BC7 0x29
3443#define V_008F14_IMG_DATA_FORMAT_RESERVED_42 0x2A 3450#define V_008F14_IMG_DATA_FORMAT_RESERVED_42 0x2A
3444#define V_008F14_IMG_DATA_FORMAT_RESERVED_43 0x2B 3451#define V_008F14_IMG_DATA_FORMAT_RESERVED_43 0x2B
3445#define V_008F14_IMG_DATA_FORMAT_FMASK8_S2_F1 0x2C 3452#define V_008F14_IMG_DATA_FORMAT_FMASK8_S2_F1 0x2C