Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a41ceb1c authored by Marek Olšák's avatar Marek Olšák Committed by Dave Airlie
Browse files

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: default avatarMarek Olšák <maraeo@gmail.com>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent ec00efb7
Loading
Loading
Loading
Loading
+6 −5
Original line number Diff line number Diff line
@@ -3297,13 +3297,14 @@ int r100_cs_track_check(struct radeon_device *rdev, struct r100_cs_track *track)
	unsigned long size;
	unsigned prim_walk;
	unsigned nverts;
	unsigned num_cb = track->num_cb;

	for (i = 0; i < track->num_cb; i++) {
	if (!track->zb_cb_clear && !track->color_channel_mask &&
	    !track->blend_read_enable)
		num_cb = 0;

	for (i = 0; i < num_cb; i++) {
		if (track->cb[i].robj == NULL) {
			if (!(track->zb_cb_clear || track->color_channel_mask ||
			      track->blend_read_enable)) {
				continue;
			}
			DRM_ERROR("[drm] No buffer for color buffer %d !\n", i);
			return -EINVAL;
		}