diff options
-rw-r--r-- | drivers/gpu/drm/radeon/r100.c | 58 |
1 files changed, 31 insertions, 27 deletions
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index d524efd9a05..3970e62eaab 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c | |||
@@ -3158,33 +3158,6 @@ static inline void r100_cs_track_texture_print(struct r100_cs_track_texture *t) | |||
3158 | DRM_ERROR("compress format %d\n", t->compress_format); | 3158 | DRM_ERROR("compress format %d\n", t->compress_format); |
3159 | } | 3159 | } |
3160 | 3160 | ||
3161 | static int r100_cs_track_cube(struct radeon_device *rdev, | ||
3162 | struct r100_cs_track *track, unsigned idx) | ||
3163 | { | ||
3164 | unsigned face, w, h; | ||
3165 | struct radeon_bo *cube_robj; | ||
3166 | unsigned long size; | ||
3167 | |||
3168 | for (face = 0; face < 5; face++) { | ||
3169 | cube_robj = track->textures[idx].cube_info[face].robj; | ||
3170 | w = track->textures[idx].cube_info[face].width; | ||
3171 | h = track->textures[idx].cube_info[face].height; | ||
3172 | |||
3173 | size = w * h; | ||
3174 | size *= track->textures[idx].cpp; | ||
3175 | |||
3176 | size += track->textures[idx].cube_info[face].offset; | ||
3177 | |||
3178 | if (size > radeon_bo_size(cube_robj)) { | ||
3179 | DRM_ERROR("Cube texture offset greater than object size %lu %lu\n", | ||
3180 | size, radeon_bo_size(cube_robj)); | ||
3181 | r100_cs_track_texture_print(&track->textures[idx]); | ||
3182 | return -1; | ||
3183 | } | ||
3184 | } | ||
3185 | return 0; | ||
3186 | } | ||
3187 | |||
3188 | static int r100_track_compress_size(int compress_format, int w, int h) | 3161 | static int r100_track_compress_size(int compress_format, int w, int h) |
3189 | { | 3162 | { |
3190 | int block_width, block_height, block_bytes; | 3163 | int block_width, block_height, block_bytes; |
@@ -3215,6 +3188,37 @@ static int r100_track_compress_size(int compress_format, int w, int h) | |||
3215 | return sz; | 3188 | return sz; |
3216 | } | 3189 | } |
3217 | 3190 | ||
3191 | static int r100_cs_track_cube(struct radeon_device *rdev, | ||
3192 | struct r100_cs_track *track, unsigned idx) | ||
3193 | { | ||
3194 | unsigned face, w, h; | ||
3195 | struct radeon_bo *cube_robj; | ||
3196 | unsigned long size; | ||
3197 | unsigned compress_format = track->textures[idx].compress_format; | ||
3198 | |||
3199 | for (face = 0; face < 5; face++) { | ||
3200 | cube_robj = track->textures[idx].cube_info[face].robj; | ||
3201 | w = track->textures[idx].cube_info[face].width; | ||
3202 | h = track->textures[idx].cube_info[face].height; | ||
3203 | |||
3204 | if (compress_format) { | ||
3205 | size = r100_track_compress_size(compress_format, w, h); | ||
3206 | } else | ||
3207 | size = w * h; | ||
3208 | size *= track->textures[idx].cpp; | ||
3209 | |||
3210 | size += track->textures[idx].cube_info[face].offset; | ||
3211 | |||
3212 | if (size > radeon_bo_size(cube_robj)) { | ||
3213 | DRM_ERROR("Cube texture offset greater than object size %lu %lu\n", | ||
3214 | size, radeon_bo_size(cube_robj)); | ||
3215 | r100_cs_track_texture_print(&track->textures[idx]); | ||
3216 | return -1; | ||
3217 | } | ||
3218 | } | ||
3219 | return 0; | ||
3220 | } | ||
3221 | |||
3218 | static int r100_cs_track_texture_check(struct radeon_device *rdev, | 3222 | static int r100_cs_track_texture_check(struct radeon_device *rdev, |
3219 | struct r100_cs_track *track) | 3223 | struct r100_cs_track *track) |
3220 | { | 3224 | { |