aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorMarek Olšák <maraeo@gmail.com>2010-09-11 23:09:13 -0400
committerDave Airlie <airlied@redhat.com>2010-09-13 06:30:18 -0400
commita41ceb1c17af06a17c0d88e987215ef20b93c471 (patch)
treeef89ede40fc1450678beeaab5250b008c2d477b6 /drivers/gpu
parentec00efb72f4b88078427d01f38f664c67c7ca0c0 (diff)
drm/radeon/kms: fix the colorbuffer CS checker for r300-r500
This commit fixes bogus CS rejection if it contains a sequence of the following operations: - Set the color buffer 0. track->cb[i].robj becomes non-NULL. - Render. - Set a larger zbuffer than the previously-set color buffer. - Set a larger scissor area as well. - Set the color channel mask to 0 to do depth-only rendering. - Render. --> rejected, because track->cb[i].robj remained non-NULL, therefore the conditional checking for the color channel mask and friends is not performed, and the larger scissor area causes the rejection. This fixes bugs: - https://bugs.freedesktop.org/show_bug.cgi?id=29762 - https://bugs.freedesktop.org/show_bug.cgi?id=28869 And maybe some others which seem to look the same. If possible, this commit should go to stable as well. Signed-off-by: Marek Olšák <maraeo@gmail.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/radeon/r100.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c
index ec64b365ee1f..e151f16a8f86 100644
--- a/drivers/gpu/drm/radeon/r100.c
+++ b/drivers/gpu/drm/radeon/r100.c
@@ -3297,13 +3297,14 @@ int r100_cs_track_check(struct radeon_device *rdev, struct r100_cs_track *track)
3297 unsigned long size; 3297 unsigned long size;
3298 unsigned prim_walk; 3298 unsigned prim_walk;
3299 unsigned nverts; 3299 unsigned nverts;
3300 unsigned num_cb = track->num_cb;
3300 3301
3301 for (i = 0; i < track->num_cb; i++) { 3302 if (!track->zb_cb_clear && !track->color_channel_mask &&
3303 !track->blend_read_enable)
3304 num_cb = 0;
3305
3306 for (i = 0; i < num_cb; i++) {
3302 if (track->cb[i].robj == NULL) { 3307 if (track->cb[i].robj == NULL) {
3303 if (!(track->zb_cb_clear || track->color_channel_mask ||
3304 track->blend_read_enable)) {
3305 continue;
3306 }
3307 DRM_ERROR("[drm] No buffer for color buffer %d !\n", i); 3308 DRM_ERROR("[drm] No buffer for color buffer %d !\n", i);
3308 return -EINVAL; 3309 return -EINVAL;
3309 } 3310 }