diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/r100.c')
-rw-r--r-- | drivers/gpu/drm/radeon/r100.c | 54 |
1 files changed, 50 insertions, 4 deletions
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index 824cc6480a06..84e5df766d3f 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c | |||
@@ -1374,7 +1374,6 @@ static int r100_packet0_check(struct radeon_cs_parser *p, | |||
1374 | case RADEON_TXFORMAT_ARGB4444: | 1374 | case RADEON_TXFORMAT_ARGB4444: |
1375 | case RADEON_TXFORMAT_VYUY422: | 1375 | case RADEON_TXFORMAT_VYUY422: |
1376 | case RADEON_TXFORMAT_YVYU422: | 1376 | case RADEON_TXFORMAT_YVYU422: |
1377 | case RADEON_TXFORMAT_DXT1: | ||
1378 | case RADEON_TXFORMAT_SHADOW16: | 1377 | case RADEON_TXFORMAT_SHADOW16: |
1379 | case RADEON_TXFORMAT_LDUDV655: | 1378 | case RADEON_TXFORMAT_LDUDV655: |
1380 | case RADEON_TXFORMAT_DUDV88: | 1379 | case RADEON_TXFORMAT_DUDV88: |
@@ -1382,12 +1381,19 @@ static int r100_packet0_check(struct radeon_cs_parser *p, | |||
1382 | break; | 1381 | break; |
1383 | case RADEON_TXFORMAT_ARGB8888: | 1382 | case RADEON_TXFORMAT_ARGB8888: |
1384 | case RADEON_TXFORMAT_RGBA8888: | 1383 | case RADEON_TXFORMAT_RGBA8888: |
1385 | case RADEON_TXFORMAT_DXT23: | ||
1386 | case RADEON_TXFORMAT_DXT45: | ||
1387 | case RADEON_TXFORMAT_SHADOW32: | 1384 | case RADEON_TXFORMAT_SHADOW32: |
1388 | case RADEON_TXFORMAT_LDUDUV8888: | 1385 | case RADEON_TXFORMAT_LDUDUV8888: |
1389 | track->textures[i].cpp = 4; | 1386 | track->textures[i].cpp = 4; |
1390 | break; | 1387 | break; |
1388 | case RADEON_TXFORMAT_DXT1: | ||
1389 | track->textures[i].cpp = 1; | ||
1390 | track->textures[i].compress_format = R100_TRACK_COMP_DXT1; | ||
1391 | break; | ||
1392 | case RADEON_TXFORMAT_DXT23: | ||
1393 | case RADEON_TXFORMAT_DXT45: | ||
1394 | track->textures[i].cpp = 1; | ||
1395 | track->textures[i].compress_format = R100_TRACK_COMP_DXT35; | ||
1396 | break; | ||
1391 | } | 1397 | } |
1392 | track->textures[i].cube_info[4].width = 1 << ((idx_value >> 16) & 0xf); | 1398 | track->textures[i].cube_info[4].width = 1 << ((idx_value >> 16) & 0xf); |
1393 | track->textures[i].cube_info[4].height = 1 << ((idx_value >> 20) & 0xf); | 1399 | track->textures[i].cube_info[4].height = 1 << ((idx_value >> 20) & 0xf); |
@@ -2731,6 +2737,7 @@ static inline void r100_cs_track_texture_print(struct r100_cs_track_texture *t) | |||
2731 | DRM_ERROR("coordinate type %d\n", t->tex_coord_type); | 2737 | DRM_ERROR("coordinate type %d\n", t->tex_coord_type); |
2732 | DRM_ERROR("width round to power of 2 %d\n", t->roundup_w); | 2738 | DRM_ERROR("width round to power of 2 %d\n", t->roundup_w); |
2733 | DRM_ERROR("height round to power of 2 %d\n", t->roundup_h); | 2739 | DRM_ERROR("height round to power of 2 %d\n", t->roundup_h); |
2740 | DRM_ERROR("compress format %d\n", t->compress_format); | ||
2734 | } | 2741 | } |
2735 | 2742 | ||
2736 | static int r100_cs_track_cube(struct radeon_device *rdev, | 2743 | static int r100_cs_track_cube(struct radeon_device *rdev, |
@@ -2760,6 +2767,36 @@ static int r100_cs_track_cube(struct radeon_device *rdev, | |||
2760 | return 0; | 2767 | return 0; |
2761 | } | 2768 | } |
2762 | 2769 | ||
2770 | static int r100_track_compress_size(int compress_format, int w, int h) | ||
2771 | { | ||
2772 | int block_width, block_height, block_bytes; | ||
2773 | int wblocks, hblocks; | ||
2774 | int min_wblocks; | ||
2775 | int sz; | ||
2776 | |||
2777 | block_width = 4; | ||
2778 | block_height = 4; | ||
2779 | |||
2780 | switch (compress_format) { | ||
2781 | case R100_TRACK_COMP_DXT1: | ||
2782 | block_bytes = 8; | ||
2783 | min_wblocks = 4; | ||
2784 | break; | ||
2785 | default: | ||
2786 | case R100_TRACK_COMP_DXT35: | ||
2787 | block_bytes = 16; | ||
2788 | min_wblocks = 2; | ||
2789 | break; | ||
2790 | } | ||
2791 | |||
2792 | hblocks = (h + block_height - 1) / block_height; | ||
2793 | wblocks = (w + block_width - 1) / block_width; | ||
2794 | if (wblocks < min_wblocks) | ||
2795 | wblocks = min_wblocks; | ||
2796 | sz = wblocks * hblocks * block_bytes; | ||
2797 | return sz; | ||
2798 | } | ||
2799 | |||
2763 | static int r100_cs_track_texture_check(struct radeon_device *rdev, | 2800 | static int r100_cs_track_texture_check(struct radeon_device *rdev, |
2764 | struct r100_cs_track *track) | 2801 | struct r100_cs_track *track) |
2765 | { | 2802 | { |
@@ -2797,9 +2834,15 @@ static int r100_cs_track_texture_check(struct radeon_device *rdev, | |||
2797 | h = h / (1 << i); | 2834 | h = h / (1 << i); |
2798 | if (track->textures[u].roundup_h) | 2835 | if (track->textures[u].roundup_h) |
2799 | h = roundup_pow_of_two(h); | 2836 | h = roundup_pow_of_two(h); |
2800 | size += w * h; | 2837 | if (track->textures[u].compress_format) { |
2838 | |||
2839 | size += r100_track_compress_size(track->textures[u].compress_format, w, h); | ||
2840 | /* compressed textures are block based */ | ||
2841 | } else | ||
2842 | size += w * h; | ||
2801 | } | 2843 | } |
2802 | size *= track->textures[u].cpp; | 2844 | size *= track->textures[u].cpp; |
2845 | |||
2803 | switch (track->textures[u].tex_coord_type) { | 2846 | switch (track->textures[u].tex_coord_type) { |
2804 | case 0: | 2847 | case 0: |
2805 | break; | 2848 | break; |
@@ -2967,6 +3010,7 @@ void r100_cs_track_clear(struct radeon_device *rdev, struct r100_cs_track *track | |||
2967 | track->arrays[i].esize = 0x7F; | 3010 | track->arrays[i].esize = 0x7F; |
2968 | } | 3011 | } |
2969 | for (i = 0; i < track->num_texture; i++) { | 3012 | for (i = 0; i < track->num_texture; i++) { |
3013 | track->textures[i].compress_format = R100_TRACK_COMP_NONE; | ||
2970 | track->textures[i].pitch = 16536; | 3014 | track->textures[i].pitch = 16536; |
2971 | track->textures[i].width = 16536; | 3015 | track->textures[i].width = 16536; |
2972 | track->textures[i].height = 16536; | 3016 | track->textures[i].height = 16536; |
@@ -3399,6 +3443,8 @@ int r100_init(struct radeon_device *rdev) | |||
3399 | r100_errata(rdev); | 3443 | r100_errata(rdev); |
3400 | /* Initialize clocks */ | 3444 | /* Initialize clocks */ |
3401 | radeon_get_clock_info(rdev->ddev); | 3445 | radeon_get_clock_info(rdev->ddev); |
3446 | /* Initialize power management */ | ||
3447 | radeon_pm_init(rdev); | ||
3402 | /* Get vram informations */ | 3448 | /* Get vram informations */ |
3403 | r100_vram_info(rdev); | 3449 | r100_vram_info(rdev); |
3404 | /* Initialize memory controller (also test AGP) */ | 3450 | /* Initialize memory controller (also test AGP) */ |