diff options
author | Jerome Glisse <jglisse@redhat.com> | 2013-04-08 10:57:05 -0400 |
---|---|---|
committer | Jerome Glisse <jglisse@redhat.com> | 2013-04-18 17:25:38 -0400 |
commit | d0e9aaa31cb13404914aea292879739d4044f856 (patch) | |
tree | 32b850748af7544263713251f480be5e955a5654 | |
parent | dc21e30a6283629bed6db282caff0af13f3b88ec (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.c | 71 | ||||
-rw-r--r-- | src/gallium/drivers/radeonsi/sid.h | 7 |
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 |