* [PATCH v2] intel: Fix stencil buffer to be W tiled
@ 2011-07-19 0:08 Chad Versace
2011-07-19 0:08 ` [PATCH] dri: Do not tile stencil buffer Chad Versace
2011-07-19 0:08 ` [PATCH] intel: Fix stencil buffer to be W tiled Chad Versace
0 siblings, 2 replies; 6+ messages in thread
From: Chad Versace @ 2011-07-19 0:08 UTC (permalink / raw)
To: intel-gfx, mesa-dev; +Cc: Chad Versace
Patch 1 v2:
- Change buffer height from ALIGN(height / 2, 64) to
ALIGN((height + 1) / 2, 64).
Patch 2 v2:
- Change buffer height from ALIGN(height / 2, 64) to
ALIGN((height + 1) / 2, 64).
- Change return type of intel_offset_S8 changed to intptr_t.
- Improve performance of Y_FLIP.
- Remove XXX comment in intel_alloc_renderbuffer_storage.
xf86-video-intel
dri: Do not tile stencil buffer
src/intel_dri.c | 16 ++++++++++++----
mesa
intel: Fix stencil buffer to be W tiled
src/mesa/drivers/dri/intel/intel_clear.c | 6 ++
src/mesa/drivers/dri/intel/intel_context.c | 9 ++-
src/mesa/drivers/dri/intel/intel_fbo.c | 12 ++--
src/mesa/drivers/dri/intel/intel_screen.h | 9 ++-
src/mesa/drivers/dri/intel/intel_span.c | 88 +++++++++++++++++++++-------
5 files changed, 93 insertions(+), 31 deletions(-)
--
1.7.6
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH] dri: Do not tile stencil buffer
2011-07-19 0:08 [PATCH v2] intel: Fix stencil buffer to be W tiled Chad Versace
@ 2011-07-19 0:08 ` Chad Versace
2011-07-19 0:18 ` Kenneth Graunke
2011-07-19 0:08 ` [PATCH] intel: Fix stencil buffer to be W tiled Chad Versace
1 sibling, 1 reply; 6+ messages in thread
From: Chad Versace @ 2011-07-19 0:08 UTC (permalink / raw)
To: intel-gfx, mesa-dev; +Cc: Chad Versace, Ian Romancik
Until now, the stencil buffer was allocated as a Y tiled buffer, because
in several locations the PRM states that it is. However, it is actually
W tiled. From the PRM, 2011 Sandy Bridge, Volume 1, Part 2, Section
4.5.2.1 W-Major Format:
W-Major Tile Format is used for separate stencil.
The GTT is incapable of W fencing, so we allocate the stencil buffer with
I915_TILING_NONE and decode the tile's layout in software.
This commit mutually depends on the mesa commit:
intel: Fix stencil buffer to be W tiled
Author: Chad Versace <chad@chad-versace.us>
Date: Mon Jul 18 00:37:45 2011 -0700
CC: Eric Anholt <eric@anholt.net>
CC: Kenneth Graunke <kenneth@whitecape.org>
CC: Ian Romancik <ian.d.romanick@intel.com>
Signed-off-by: Chad Versace <chad@chad-versace.us>
---
src/intel_dri.c | 16 ++++++++++++----
1 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/src/intel_dri.c b/src/intel_dri.c
index 1269422..90abe5f 100644
--- a/src/intel_dri.c
+++ b/src/intel_dri.c
@@ -335,7 +335,6 @@ I830DRI2CreateBuffer(DrawablePtr drawable, unsigned int attachment,
switch (attachment) {
case DRI2BufferDepth:
case DRI2BufferDepthStencil:
- case DRI2BufferStencil:
case DRI2BufferHiz:
if (SUPPORTS_YTILING(intel)) {
hint |= INTEL_CREATE_PIXMAP_TILING_Y;
@@ -350,6 +349,14 @@ I830DRI2CreateBuffer(DrawablePtr drawable, unsigned int attachment,
case DRI2BufferFrontRight:
hint |= INTEL_CREATE_PIXMAP_TILING_X;
break;
+ case DRI2BufferStencil:
+ /*
+ * The stencil buffer is W tiled. However, we
+ * request from the kernel a non-tiled buffer
+ * because the GTT is incapable of W fencing.
+ */
+ hint |= INTEL_CREATE_PIXMAP_TILING_NONE;
+ break;
default:
free(privates);
free(buffer);
@@ -367,11 +374,12 @@ I830DRI2CreateBuffer(DrawablePtr drawable, unsigned int attachment,
* To accomplish this, we resort to the nasty hack of doubling
* the drm region's cpp and halving its height.
*
- * If we neglect to double the pitch, then
- * drm_intel_gem_bo_map_gtt() maps the memory incorrectly.
+ * If we neglect to double the pitch, then render corruption
+ * occurs.
*/
if (attachment == DRI2BufferStencil) {
- pixmap_height /= 2;
+ pixmap_width = ALIGN(pixmap_width, 64);
+ pixmap_height = ALIGN((pixmap_height + 1) / 2, 64);
pixmap_cpp *= 2;
}
--
1.7.6
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH] intel: Fix stencil buffer to be W tiled
2011-07-19 0:08 [PATCH v2] intel: Fix stencil buffer to be W tiled Chad Versace
2011-07-19 0:08 ` [PATCH] dri: Do not tile stencil buffer Chad Versace
@ 2011-07-19 0:08 ` Chad Versace
1 sibling, 0 replies; 6+ messages in thread
From: Chad Versace @ 2011-07-19 0:08 UTC (permalink / raw)
To: intel-gfx, mesa-dev; +Cc: Chad Versace, Ian Romancik
Until now, the stencil buffer was allocated as a Y tiled buffer, because
in several locations the PRM states that it is. However, it is actually
W tiled. From the PRM, 2011 Sandy Bridge, Volume 1, Part 2, Section
4.5.2.1 W-Major Format:
W-Major Tile Format is used for separate stencil.
The GTT is incapable of W fencing, so we allocate the stencil buffer with
I915_TILING_NONE and decode the tile's layout in software.
This fix touches the following portions of code:
- In intel_allocate_renderbuffer_storage(), allocate the stencil
buffer with I915_TILING_NONE.
- In intel_verify_dri2_has_hiz(), verify that the stencil buffer is
not tiled.
- In the stencil buffer's span functions, the tile's layout must be
decoded in software.
This commit mutually depends on the xf86-video-intel commit
dri: Do not tile stencil buffer
Author: Chad Versace <chad@chad-versace.us>
Date: Mon Jul 18 00:38:00 2011 -0700
On Gen6 with separate stencil enabled, fixes the following Piglit tests:
bugs/fdo23670-drawpix_stencil
general/stencil-drawpixels
spec/EXT_framebuffer_object/fbo-stencil-GL_STENCIL_INDEX16-copypixels
spec/EXT_framebuffer_object/fbo-stencil-GL_STENCIL_INDEX16-drawpixels
spec/EXT_framebuffer_object/fbo-stencil-GL_STENCIL_INDEX16-readpixels
spec/EXT_framebuffer_object/fbo-stencil-GL_STENCIL_INDEX1-copypixels
spec/EXT_framebuffer_object/fbo-stencil-GL_STENCIL_INDEX1-drawpixels
spec/EXT_framebuffer_object/fbo-stencil-GL_STENCIL_INDEX1-readpixels
spec/EXT_framebuffer_object/fbo-stencil-GL_STENCIL_INDEX4-copypixels
spec/EXT_framebuffer_object/fbo-stencil-GL_STENCIL_INDEX4-drawpixels
spec/EXT_framebuffer_object/fbo-stencil-GL_STENCIL_INDEX4-readpixels
spec/EXT_framebuffer_object/fbo-stencil-GL_STENCIL_INDEX8-copypixels
spec/EXT_framebuffer_object/fbo-stencil-GL_STENCIL_INDEX8-drawpixels
spec/EXT_framebuffer_object/fbo-stencil-GL_STENCIL_INDEX8-readpixels
spec/EXT_packed_depth_stencil/fbo-stencil-GL_DEPTH24_STENCIL8-copypixels
spec/EXT_packed_depth_stencil/fbo-stencil-GL_DEPTH24_STENCIL8-readpixels
spec/EXT_packed_depth_stencil/readpixels-24_8
Note: This is a candidate for the 7.11 branch.
CC: Eric Anholt <eric@anholt.net>
CC: Kenneth Graunke <kenneth@whitecape.org>
CC: Ian Romancik <ian.d.romanick@intel.com>
Signed-off-by: Chad Versace <chad@chad-versace.us>
---
src/mesa/drivers/dri/intel/intel_clear.c | 6 ++
src/mesa/drivers/dri/intel/intel_context.c | 9 ++-
src/mesa/drivers/dri/intel/intel_fbo.c | 12 ++--
src/mesa/drivers/dri/intel/intel_screen.h | 9 ++-
src/mesa/drivers/dri/intel/intel_span.c | 88 +++++++++++++++++++++-------
5 files changed, 93 insertions(+), 31 deletions(-)
diff --git a/src/mesa/drivers/dri/intel/intel_clear.c b/src/mesa/drivers/dri/intel/intel_clear.c
index dfca03c..5ab9873 100644
--- a/src/mesa/drivers/dri/intel/intel_clear.c
+++ b/src/mesa/drivers/dri/intel/intel_clear.c
@@ -143,6 +143,12 @@ intelClear(struct gl_context *ctx, GLbitfield mask)
*/
tri_mask |= BUFFER_BIT_STENCIL;
}
+ else if (intel->has_separate_stencil &&
+ stencilRegion->tiling == I915_TILING_NONE) {
+ /* The stencil buffer is actually W tiled, which the hardware
+ * cannot blit to. */
+ tri_mask |= BUFFER_BIT_STENCIL;
+ }
else {
/* clearing all stencil bits, use blitting */
blit_mask |= BUFFER_BIT_STENCIL;
diff --git a/src/mesa/drivers/dri/intel/intel_context.c b/src/mesa/drivers/dri/intel/intel_context.c
index 2ba1363..fe8be08 100644
--- a/src/mesa/drivers/dri/intel/intel_context.c
+++ b/src/mesa/drivers/dri/intel/intel_context.c
@@ -1439,7 +1439,12 @@ intel_verify_dri2_has_hiz(struct intel_context *intel,
assert(stencil_rb->Base.Format == MESA_FORMAT_S8);
assert(depth_rb && depth_rb->Base.Format == MESA_FORMAT_X8_Z24);
- if (stencil_rb->region->tiling == I915_TILING_Y) {
+ if (stencil_rb->region->tiling == I915_TILING_NONE) {
+ /*
+ * The stencil buffer is actually W tiled. The region's tiling is
+ * I915_TILING_NONE, however, because the GTT is incapable of W
+ * fencing.
+ */
intel->intelScreen->dri2_has_hiz = INTEL_DRI2_HAS_HIZ_TRUE;
return;
} else {
@@ -1527,7 +1532,7 @@ intel_verify_dri2_has_hiz(struct intel_context *intel,
* Presently, however, no verification or clean up is necessary, and
* execution should not reach here. If the framebuffer still has a hiz
* region, then we have already set dri2_has_hiz to true after
- * confirming above that the stencil buffer is Y tiled.
+ * confirming above that the stencil buffer is W tiled.
*/
assert(0);
}
diff --git a/src/mesa/drivers/dri/intel/intel_fbo.c b/src/mesa/drivers/dri/intel/intel_fbo.c
index 1669af2..2206391 100644
--- a/src/mesa/drivers/dri/intel/intel_fbo.c
+++ b/src/mesa/drivers/dri/intel/intel_fbo.c
@@ -173,6 +173,9 @@ intel_alloc_renderbuffer_storage(struct gl_context * ctx, struct gl_renderbuffer
if (irb->Base.Format == MESA_FORMAT_S8) {
/*
+ * The stencil buffer is W tiled. However, we request from the kernel a
+ * non-tiled buffer because the GTT is incapable of W fencing.
+ *
* The stencil buffer has quirky pitch requirements. From Vol 2a,
* 11.5.6.2.1 3DSTATE_STENCIL_BUFFER, field "Surface Pitch":
* The pitch must be set to 2x the value computed based on width, as
@@ -180,14 +183,13 @@ intel_alloc_renderbuffer_storage(struct gl_context * ctx, struct gl_renderbuffer
* To accomplish this, we resort to the nasty hack of doubling the drm
* region's cpp and halving its height.
*
- * If we neglect to double the pitch, then drm_intel_gem_bo_map_gtt()
- * maps the memory incorrectly.
+ * If we neglect to double the pitch, then render corruption occurs.
*/
irb->region = intel_region_alloc(intel->intelScreen,
- I915_TILING_Y,
+ I915_TILING_NONE,
cpp * 2,
- width,
- height / 2,
+ ALIGN(width, 64),
+ ALIGN((height + 1) / 2, 64),
GL_TRUE);
if (!irb->region)
return false;
diff --git a/src/mesa/drivers/dri/intel/intel_screen.h b/src/mesa/drivers/dri/intel/intel_screen.h
index b2013af..9dd6a52 100644
--- a/src/mesa/drivers/dri/intel/intel_screen.h
+++ b/src/mesa/drivers/dri/intel/intel_screen.h
@@ -63,9 +63,12 @@
* x8_z24 and s8).
*
* Eventually, intel_update_renderbuffers() makes a DRI2 request for
- * DRI2BufferStencil and DRI2BufferHiz. If the returned buffers are Y tiled,
- * then we joyfully set intel_screen.dri2_has_hiz to true and continue as if
- * nothing happend.
+ * DRI2BufferStencil and DRI2BufferHiz. If the stencil buffer's tiling is
+ * I915_TILING_NONE [1], then we joyfully set intel_screen.dri2_has_hiz to
+ * true and continue as if nothing happend.
+ *
+ * [1] The stencil buffer is actually W tiled. However, we request from the
+ * kernel a non-tiled buffer because the GTT is incapable of W fencing.
*
* If the buffers are X tiled, however, the handshake has failed and we must
* clean up.
diff --git a/src/mesa/drivers/dri/intel/intel_span.c b/src/mesa/drivers/dri/intel/intel_span.c
index 153803f..2e1c80c 100644
--- a/src/mesa/drivers/dri/intel/intel_span.c
+++ b/src/mesa/drivers/dri/intel/intel_span.c
@@ -131,38 +131,84 @@ intel_set_span_functions(struct intel_context *intel,
int miny = 0; \
int maxx = rb->Width; \
int maxy = rb->Height; \
- int stride = rb->RowStride; \
- uint8_t *buf = rb->Data; \
+ \
+ /* \
+ * Here we ignore rb->Data and rb->RowStride as set by \
+ * intelSpanRenderStart. Since intel_offset_S8 decodes the W tile \
+ * manually, the region's *real* base address and stride is \
+ * required. \
+ */ \
+ struct intel_renderbuffer *irb = intel_renderbuffer(rb); \
+ uint8_t *buf = irb->region->buffer->virtual; \
+ unsigned stride = irb->region->pitch; \
+ unsigned height = 2 * irb->region->height; \
+ bool flip = rb->Name == 0; \
+ int y_scale = flip ? -1 : 1; \
+ int y_bias = flip ? (height - 1) : 0; \
-/* Don't flip y. */
#undef Y_FLIP
-#define Y_FLIP(y) y
+#define Y_FLIP(y) (y_scale * (y) + y_bias)
/**
* \brief Get pointer offset into stencil buffer.
*
- * The stencil buffer interleaves two rows into one. Yay for crazy hardware.
- * The table below demonstrates how the pointer arithmetic behaves for a buffer
- * with positive stride (s=stride).
- *
- * x | y | byte offset
- * --------------------------
- * 0 | 0 | 0
- * 0 | 1 | 1
- * 1 | 0 | 2
- * 1 | 1 | 3
- * ... | ... | ...
- * 0 | 2 | s
- * 0 | 3 | s + 1
- * 1 | 2 | s + 2
- * 1 | 3 | s + 3
+ * The stencil buffer is W tiled. Since the GTT is incapable of W fencing, we
+ * must decode the tile's layout in software.
*
+ * See
+ * - PRM, 2011 Sandy Bridge, Volume 1, Part 2, Section 4.5.2.1 W-Major Tile
+ * Format.
+ * - PRM, 2011 Sandy Bridge, Volume 1, Part 2, Section 4.5.3 Tiling Algorithm
*
+ * Even though the returned offset is always positive, the return type is
+ * signed due to
+ * commit e8b1c6d6f55f5be3bef25084fdd8b6127517e137
+ * mesa: Fix return type of _mesa_get_format_bytes() (#37351)
*/
static inline intptr_t
-intel_offset_S8(int stride, GLint x, GLint y)
+intel_offset_S8(uint32_t stride, uint32_t x, uint32_t y)
{
- return 2 * ((y / 2) * stride + x) + y % 2;
+ uint32_t tile_size = 4096;
+ uint32_t tile_width = 64;
+ uint32_t tile_height = 64;
+ uint32_t row_size = 64 * stride;
+
+ uint32_t tile_x = x / tile_width;
+ uint32_t tile_y = y / tile_height;
+
+ /* The byte's address relative to the tile's base addres. */
+ uint32_t byte_x = x % tile_width;
+ uint32_t byte_y = y % tile_height;
+
+ uintptr_t u = tile_y * row_size
+ + tile_x * tile_size
+ + 512 * (byte_x / 8)
+ + 64 * (byte_y / 8)
+ + 32 * ((byte_y / 4) % 2)
+ + 16 * ((byte_x / 4) % 2)
+ + 8 * ((byte_y / 2) % 2)
+ + 4 * ((byte_x / 2) % 2)
+ + 2 * (byte_y % 2)
+ + 1 * (byte_x % 2);
+
+ /*
+ * Errata for Gen5:
+ *
+ * An additional offset is needed which is not documented in the PRM.
+ *
+ * if ((byte_x / 8) % 2 == 1) {
+ * if ((byte_y / 8) % 2) == 0) {
+ * u += 64;
+ * } else {
+ * u -= 64;
+ * }
+ * }
+ *
+ * The offset is expressed more tersely as
+ * u += ((int) x & 0x8) * (8 - (((int) y & 0x8) << 1));
+ */
+
+ return u;
}
#define WRITE_STENCIL(x, y, src) buf[intel_offset_S8(stride, x, y)] = src;
--
1.7.6
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH] dri: Do not tile stencil buffer
2011-07-19 0:08 ` [PATCH] dri: Do not tile stencil buffer Chad Versace
@ 2011-07-19 0:18 ` Kenneth Graunke
0 siblings, 0 replies; 6+ messages in thread
From: Kenneth Graunke @ 2011-07-19 0:18 UTC (permalink / raw)
To: Chad Versace; +Cc: mesa-dev, intel-gfx, Ian Romancik
On 07/18/2011 05:08 PM, Chad Versace wrote:
> Until now, the stencil buffer was allocated as a Y tiled buffer, because
> in several locations the PRM states that it is. However, it is actually
> W tiled. From the PRM, 2011 Sandy Bridge, Volume 1, Part 2, Section
> 4.5.2.1 W-Major Format:
> W-Major Tile Format is used for separate stencil.
>
> The GTT is incapable of W fencing, so we allocate the stencil buffer with
> I915_TILING_NONE and decode the tile's layout in software.
>
> This commit mutually depends on the mesa commit:
> intel: Fix stencil buffer to be W tiled
> Author: Chad Versace <chad@chad-versace.us>
> Date: Mon Jul 18 00:37:45 2011 -0700
>
> CC: Eric Anholt <eric@anholt.net>
> CC: Kenneth Graunke <kenneth@whitecape.org>
> CC: Ian Romancik <ian.d.romanick@intel.com>
> Signed-off-by: Chad Versace <chad@chad-versace.us>
> ---
> src/intel_dri.c | 16 ++++++++++++----
> 1 files changed, 12 insertions(+), 4 deletions(-)
For the series:
Acked-by: Kenneth Graunke <kenneth@whitecape.org>
(I would say Reviewed-by, but I haven't verified the math. That said, I
don't think I need to...I've seen how rigorously you investigated this.)
Happy to see these go in whenever. We definitely need them in 7.11 and
2.16.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] dri: Do not tile stencil buffer
2011-07-18 7:55 ` [PATCH] dri: Do not tile stencil buffer Chad Versace
@ 2011-07-18 8:15 ` Paul Menzel
0 siblings, 0 replies; 6+ messages in thread
From: Paul Menzel @ 2011-07-18 8:15 UTC (permalink / raw)
To: intel-gfx; +Cc: mesa-dev
[-- Attachment #1.1: Type: text/plain, Size: 2668 bytes --]
Am Montag, den 18.07.2011, 00:55 -0700 schrieb Chad Versace:
> Until now, the stencil buffer was allocated as a Y tiled buffer, because
> in several locations the PRM states that it is. However, it is actually
> W tiled. From the PRM, 2011 Sandy Bridge, Volume 1, Part 2, Section
> 4.5.2.1 W-Major Format:
> W-Major Tile Format is used for separate stencil.
>
> The GTT is incapable of W fencing, so we allocate the stencil buffer with
> I915_TILING_NONE and decode the tile's layout in software.
>
> This commit mutually depends on the mesa commit:
> intel: Fix stencil buffer to be W tiled
> Author: Chad Versace <chad@chad-versace.us>
> Date: Mon Jul 18 00:37:45 2011 -0700
>
> CC: Eric Anholt <eric@anholt.net>
> CC: Kenneth Graunke <kenneth@whitecape.org>
> Signed-off-by: Chad Versace <chad@chad-versace.us>
> ---
> src/intel_dri.c | 16 ++++++++++++----
> 1 files changed, 12 insertions(+), 4 deletions(-)
>
> diff --git a/src/intel_dri.c b/src/intel_dri.c
> index 5ea7c2c..4652dc7 100644
> --- a/src/intel_dri.c
> +++ b/src/intel_dri.c
> @@ -336,7 +336,6 @@ I830DRI2CreateBuffer(DrawablePtr drawable, unsigned int attachment,
> switch (attachment) {
> case DRI2BufferDepth:
> case DRI2BufferDepthStencil:
> - case DRI2BufferStencil:
> case DRI2BufferHiz:
> if (SUPPORTS_YTILING(intel)) {
> hint |= INTEL_CREATE_PIXMAP_TILING_Y;
> @@ -351,6 +350,14 @@ I830DRI2CreateBuffer(DrawablePtr drawable, unsigned int attachment,
> case DRI2BufferFrontRight:
> hint |= INTEL_CREATE_PIXMAP_TILING_X;
> break;
> + case DRI2BufferStencil:
> + /*
> + * The stencil buffer is W tiled. However, we
> + * request from the kernel a non-tiled buffer
> + * because the GTT is incapable of W fencing.
> + */
> + hint |= INTEL_CREATE_PIXMAP_TILING_NONE;
> + break;
> default:
> free(privates);
> free(buffer);
> @@ -368,11 +375,12 @@ I830DRI2CreateBuffer(DrawablePtr drawable, unsigned int attachment,
> * To accomplish this, we resort to the nasty hack of doubling
> * the drm region's cpp and halving its height.
> *
> - * If we neglect to double the pitch, then
> - * drm_intel_gem_bo_map_gtt() maps the memory incorrectly.
> + * If we neglect to double the pitch, then render corruption
> + * occurs.
The alignment does not seem to match.
> */
> if (attachment == DRI2BufferStencil) {
> - pixmap_height /= 2;
> + pixmap_width = ALIGN(pixmap_width, 64);
> + pixmap_height = ALIGN(pixmap_height / 2, 64);
> pixmap_cpp *= 2;
> }
Thanks,
Paul
[-- Attachment #1.2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 198 bytes --]
[-- Attachment #2: Type: text/plain, Size: 159 bytes --]
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH] dri: Do not tile stencil buffer
2011-07-18 7:55 Chad Versace
@ 2011-07-18 7:55 ` Chad Versace
2011-07-18 8:15 ` Paul Menzel
0 siblings, 1 reply; 6+ messages in thread
From: Chad Versace @ 2011-07-18 7:55 UTC (permalink / raw)
To: mesa-dev, intel-gfx; +Cc: Chad Versace
Until now, the stencil buffer was allocated as a Y tiled buffer, because
in several locations the PRM states that it is. However, it is actually
W tiled. From the PRM, 2011 Sandy Bridge, Volume 1, Part 2, Section
4.5.2.1 W-Major Format:
W-Major Tile Format is used for separate stencil.
The GTT is incapable of W fencing, so we allocate the stencil buffer with
I915_TILING_NONE and decode the tile's layout in software.
This commit mutually depends on the mesa commit:
intel: Fix stencil buffer to be W tiled
Author: Chad Versace <chad@chad-versace.us>
Date: Mon Jul 18 00:37:45 2011 -0700
CC: Eric Anholt <eric@anholt.net>
CC: Kenneth Graunke <kenneth@whitecape.org>
Signed-off-by: Chad Versace <chad@chad-versace.us>
---
src/intel_dri.c | 16 ++++++++++++----
1 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/src/intel_dri.c b/src/intel_dri.c
index 5ea7c2c..4652dc7 100644
--- a/src/intel_dri.c
+++ b/src/intel_dri.c
@@ -336,7 +336,6 @@ I830DRI2CreateBuffer(DrawablePtr drawable, unsigned int attachment,
switch (attachment) {
case DRI2BufferDepth:
case DRI2BufferDepthStencil:
- case DRI2BufferStencil:
case DRI2BufferHiz:
if (SUPPORTS_YTILING(intel)) {
hint |= INTEL_CREATE_PIXMAP_TILING_Y;
@@ -351,6 +350,14 @@ I830DRI2CreateBuffer(DrawablePtr drawable, unsigned int attachment,
case DRI2BufferFrontRight:
hint |= INTEL_CREATE_PIXMAP_TILING_X;
break;
+ case DRI2BufferStencil:
+ /*
+ * The stencil buffer is W tiled. However, we
+ * request from the kernel a non-tiled buffer
+ * because the GTT is incapable of W fencing.
+ */
+ hint |= INTEL_CREATE_PIXMAP_TILING_NONE;
+ break;
default:
free(privates);
free(buffer);
@@ -368,11 +375,12 @@ I830DRI2CreateBuffer(DrawablePtr drawable, unsigned int attachment,
* To accomplish this, we resort to the nasty hack of doubling
* the drm region's cpp and halving its height.
*
- * If we neglect to double the pitch, then
- * drm_intel_gem_bo_map_gtt() maps the memory incorrectly.
+ * If we neglect to double the pitch, then render corruption
+ * occurs.
*/
if (attachment == DRI2BufferStencil) {
- pixmap_height /= 2;
+ pixmap_width = ALIGN(pixmap_width, 64);
+ pixmap_height = ALIGN(pixmap_height / 2, 64);
pixmap_cpp *= 2;
}
--
1.7.6
^ permalink raw reply related [flat|nested] 6+ messages in thread
end of thread, other threads:[~2011-07-19 0:18 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-07-19 0:08 [PATCH v2] intel: Fix stencil buffer to be W tiled Chad Versace
2011-07-19 0:08 ` [PATCH] dri: Do not tile stencil buffer Chad Versace
2011-07-19 0:18 ` Kenneth Graunke
2011-07-19 0:08 ` [PATCH] intel: Fix stencil buffer to be W tiled Chad Versace
-- strict thread matches above, loose matches on Subject: below --
2011-07-18 7:55 Chad Versace
2011-07-18 7:55 ` [PATCH] dri: Do not tile stencil buffer Chad Versace
2011-07-18 8:15 ` Paul Menzel
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).