1 /**************************************************************************
3 * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21 * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 **************************************************************************/
33 #include "intel_fbo.h"
34 #include "intel_screen.h"
35 #include "intel_span.h"
36 #include "intel_regions.h"
37 #include "intel_ioctl.h"
38 #include "intel_tex.h"
40 #include "swrast/swrast.h"
43 * Deal with tiled surfaces
47 /* These are pre-965 tile swizzling functions -- power of two widths */
48 static uintptr_t x_tile_swizzle_pow2 (uintptr_t addr
, int n
)
51 uintptr_t base_mask
= (((~0) << (n
+ 4)) | 0xff);
52 uintptr_t x_mask
= ((~0) << 12) & ~base_mask
;
54 a
= ((a
& base_mask
) |
55 ((a
>> (n
-8)) & 0x7) |
57 _mesa_printf ("x_swizzle %08x (base %x yrow %x tile#x %x xsword %x byte %x) %08x\n",
60 (addr
>> (n
+ 1)) & 0x7,
61 (addr
>> 9) & ((1 << (n
-8)) - 1),
68 static uintptr_t y_tile_swizzle_pow2 (uintptr_t addr
, int n
)
70 uintptr_t a
= (uintptr_t) addr
;
71 uintptr_t base_mask
= (((~0) << (n
+ 6)) | 0xf);
72 uintptr_t x_mask
= ((~0) << 9) & ~base_mask
;
74 a
= ((a
& base_mask
) |
75 ((a
>> (n
-3)) & 0x1f) |
77 _mesa_printf ("y_swizzle %08x (base %x yrow %x tile#x %x xoword %x byte %x) %08x\n",
80 (addr
>> (n
+ 1)) & 0x01f,
81 (addr
>> 7) & ((1 << (n
-6)) - 1),
89 static GLubyte
*x_tile_swizzle(struct intel_renderbuffer
*irb
, struct intel_context
*intel
,
92 GLubyte
*buf
= (GLubyte
*) irb
->pfMap
;
95 int x_tile_off
, y_tile_off
;
96 int x_tile_number
, y_tile_number
;
97 int tile_off
, tile_base
;
99 tile_stride
= (irb
->pfPitch
* irb
->region
->cpp
) << 3;
104 xbyte
= x
* irb
->region
->cpp
;
106 x_tile_off
= xbyte
& 0x1ff;
109 x_tile_number
= xbyte
>> 9;
110 y_tile_number
= y
>> 3;
112 tile_off
= (y_tile_off
<< 9) + x_tile_off
;
114 /* bit swizzling tricks your parents never told you about:
116 * The specs say that the X tiling layout is just 8 512-byte rows
117 * packed into a page. It turns out that there's some additional
118 * swizzling of bit 6 to reduce cache aliasing issues. Experimental
121 * line bit GM965 945G/Q965
132 * So we see that the GM965 is bit 6 ^ 9 ^ 10 ^ 11, while other
133 * parts were just 6 ^ 9 ^ 10. However, some systems, including a
134 * GM965 we've seen, don't perform the swizzling at all. Information
135 * on how to detect it through register reads is expected soon.
137 switch (intel
->tiling_swizzle_mode
) {
141 tile_off
^= ((tile_off
>> 3) & 64) ^ ((tile_off
>> 4) & 64);
144 tile_off
^= ((tile_off
>> 3) & 64) ^ ((tile_off
>> 4) & 64) ^
145 ((tile_off
>> 5) & 64);
149 tile_base
= (x_tile_number
<< 12) + y_tile_number
* tile_stride
;
152 printf("(%d,%d) -> %d + %d = %d (pitch = %d, tstride = %d)\n",
153 x
, y
, tile_off
, tile_base
,
154 tile_off
+ tile_base
,
155 irb
->pfPitch
, tile_stride
);
158 return buf
+ tile_base
+ tile_off
;
161 static GLubyte
*y_tile_swizzle(struct intel_renderbuffer
*irb
, struct intel_context
*intel
,
164 GLubyte
*buf
= (GLubyte
*) irb
->pfMap
;
167 int x_tile_off
, y_tile_off
;
168 int x_tile_number
, y_tile_number
;
169 int tile_off
, tile_base
;
171 tile_stride
= (irb
->pfPitch
* irb
->region
->cpp
) << 5;
176 xbyte
= x
* irb
->region
->cpp
;
178 x_tile_off
= xbyte
& 0x7f;
179 y_tile_off
= y
& 0x1f;
181 x_tile_number
= xbyte
>> 7;
182 y_tile_number
= y
>> 5;
184 tile_off
= ((x_tile_off
& ~0xf) << 5) + (y_tile_off
<< 4) +
187 switch (intel
->tiling_swizzle_mode
) {
191 tile_off
^= (tile_off
>> 3) & 64;
196 tile_base
= (x_tile_number
<< 12) + y_tile_number
* tile_stride
;
198 return buf
+ tile_base
+ tile_off
;
202 break intelWriteRGBASpan_ARGB8888
209 struct intel_context *intel = intel_context(ctx); \
210 struct intel_renderbuffer *irb = intel_renderbuffer(rb); \
211 const GLint yScale = irb->RenderToTexture ? 1 : -1; \
212 const GLint yBias = irb->RenderToTexture ? 0 : irb->Base.Height - 1; \
213 GLubyte *buf = (GLubyte *) irb->pfMap \
214 + (intel->drawY * irb->pfPitch + intel->drawX) * irb->region->cpp;\
217 (void) p; (void) buf;
219 /* XXX FBO: this is identical to the macro in spantmp2.h except we get
220 * the cliprect info from the context, not the driDrawable.
221 * Move this into spantmp2.h someday.
223 #define HW_CLIPLOOP() \
225 int _nc = intel->numClipRects; \
227 int minx = intel->pClipRects[_nc].x1 - intel->drawX; \
228 int miny = intel->pClipRects[_nc].y1 - intel->drawY; \
229 int maxx = intel->pClipRects[_nc].x2 - intel->drawX; \
230 int maxy = intel->pClipRects[_nc].y2 - intel->drawY;
236 #define Y_FLIP(_y) ((_y) * yScale + yBias)
238 /* XXX with GEM, these need to tell the kernel */
243 /* 16 bit, RGB565 color spanline and pixel functions
245 #define SPANTMP_PIXEL_FMT GL_RGB
246 #define SPANTMP_PIXEL_TYPE GL_UNSIGNED_SHORT_5_6_5
248 #define TAG(x) intel##x##_RGB565
249 #define TAG2(x,y) intel##x##_RGB565##y
250 #define GET_PTR(X,Y) (buf + ((Y) * irb->pfPitch + (X)) * 2)
251 #include "spantmp2.h"
253 /* 32 bit, ARGB8888 color spanline and pixel functions
255 #define SPANTMP_PIXEL_FMT GL_BGRA
256 #define SPANTMP_PIXEL_TYPE GL_UNSIGNED_INT_8_8_8_8_REV
258 #define TAG(x) intel##x##_ARGB8888
259 #define TAG2(x,y) intel##x##_ARGB8888##y
260 #define GET_PTR(X,Y) (buf + ((Y) * irb->pfPitch + (X)) * 4)
261 #include "spantmp2.h"
263 /* 16 bit RGB565 color tile spanline and pixel functions
266 #define SPANTMP_PIXEL_FMT GL_RGB
267 #define SPANTMP_PIXEL_TYPE GL_UNSIGNED_SHORT_5_6_5
269 #define TAG(x) intel_XTile_##x##_RGB565
270 #define TAG2(x,y) intel_XTile_##x##_RGB565##y
271 #define GET_PTR(X,Y) x_tile_swizzle(irb, intel, X, Y)
272 #include "spantmp2.h"
274 #define SPANTMP_PIXEL_FMT GL_RGB
275 #define SPANTMP_PIXEL_TYPE GL_UNSIGNED_SHORT_5_6_5
277 #define TAG(x) intel_YTile_##x##_RGB565
278 #define TAG2(x,y) intel_YTile_##x##_RGB565##y
279 #define GET_PTR(X,Y) y_tile_swizzle(irb, intel, X, Y)
280 #include "spantmp2.h"
282 /* 32 bit ARGB888 color tile spanline and pixel functions
285 #define SPANTMP_PIXEL_FMT GL_BGRA
286 #define SPANTMP_PIXEL_TYPE GL_UNSIGNED_INT_8_8_8_8_REV
288 #define TAG(x) intel_XTile_##x##_ARGB8888
289 #define TAG2(x,y) intel_XTile_##x##_ARGB8888##y
290 #define GET_PTR(X,Y) x_tile_swizzle(irb, intel, X, Y)
291 #include "spantmp2.h"
293 #define SPANTMP_PIXEL_FMT GL_BGRA
294 #define SPANTMP_PIXEL_TYPE GL_UNSIGNED_INT_8_8_8_8_REV
296 #define TAG(x) intel_YTile_##x##_ARGB8888
297 #define TAG2(x,y) intel_YTile_##x##_ARGB8888##y
298 #define GET_PTR(X,Y) y_tile_swizzle(irb, intel, X, Y)
299 #include "spantmp2.h"
301 #define LOCAL_DEPTH_VARS \
302 struct intel_context *intel = intel_context(ctx); \
303 struct intel_renderbuffer *irb = intel_renderbuffer(rb); \
304 const GLuint pitch = irb->pfPitch/***XXX region->pitch*/; /* in pixels */ \
305 const GLint yScale = irb->RenderToTexture ? 1 : -1; \
306 const GLint yBias = irb->RenderToTexture ? 0 : irb->Base.Height - 1; \
307 char *buf = (char *) irb->pfMap/*XXX use region->map*/ + \
308 (intel->drawY * pitch + intel->drawX) * irb->region->cpp; (void) buf;
311 #define LOCAL_STENCIL_VARS LOCAL_DEPTH_VARS
314 ** 16-bit depthbuffer functions.
316 #define WRITE_DEPTH( _x, _y, d ) \
317 ((GLushort *)buf)[(_x) + (_y) * pitch] = d;
319 #define READ_DEPTH( d, _x, _y ) \
320 d = ((GLushort *)buf)[(_x) + (_y) * pitch];
323 #define TAG(x) intel##x##_z16
324 #include "depthtmp.h"
328 ** 16-bit x tile depthbuffer functions.
330 #define WRITE_DEPTH( _x, _y, d ) \
331 (*((GLushort *)x_tile_swizzle (irb, intel, _x, _y)) = d)
333 #define READ_DEPTH( d, _x, _y ) \
334 d = *((GLushort *)x_tile_swizzle (irb, intel, _x, _y))
337 #define TAG(x) intel_XTile_##x##_z16
338 #include "depthtmp.h"
341 ** 16-bit y tile depthbuffer functions.
343 #define WRITE_DEPTH( _x, _y, d ) \
344 (*((GLushort *)y_tile_swizzle (irb, intel, _x, _y)) = d)
346 #define READ_DEPTH( d, _x, _y ) \
347 (d = *((GLushort *)y_tile_swizzle (irb, intel, _x, _y)))
350 #define TAG(x) intel_YTile_##x##_z16
351 #include "depthtmp.h"
355 ** 24/8-bit interleaved depth/stencil functions
356 ** Note: we're actually reading back combined depth+stencil values.
357 ** The wrappers in main/depthstencil.c are used to extract the depth
358 ** and stencil values.
360 /* Change ZZZS -> SZZZ */
361 #define WRITE_DEPTH( _x, _y, d ) { \
362 GLuint tmp = ((d) >> 8) | ((d) << 24); \
363 ((GLuint *)buf)[(_x) + (_y) * pitch] = tmp; \
366 /* Change SZZZ -> ZZZS */
367 #define READ_DEPTH( d, _x, _y ) { \
368 GLuint tmp = ((GLuint *)buf)[(_x) + (_y) * pitch]; \
369 d = (tmp << 8) | (tmp >> 24); \
372 #define TAG(x) intel##x##_z24_s8
373 #include "depthtmp.h"
377 ** 24/8-bit x-tile interleaved depth/stencil functions
378 ** Note: we're actually reading back combined depth+stencil values.
379 ** The wrappers in main/depthstencil.c are used to extract the depth
380 ** and stencil values.
382 /* Change ZZZS -> SZZZ */
383 #define WRITE_DEPTH( _x, _y, d ) { \
384 GLuint tmp = ((d) >> 8) | ((d) << 24); \
385 *((GLuint *)x_tile_swizzle (irb, intel, _x, _y)) = tmp; \
388 /* Change SZZZ -> ZZZS */
389 #define READ_DEPTH( d, _x, _y ) { \
390 GLuint tmp = *((GLuint *)x_tile_swizzle (irb, intel, _x, _y)); \
391 d = (tmp << 8) | (tmp >> 24); \
394 #define TAG(x) intel_XTile_##x##_z24_s8
395 #include "depthtmp.h"
398 ** 24/8-bit y-tile interleaved depth/stencil functions
399 ** Note: we're actually reading back combined depth+stencil values.
400 ** The wrappers in main/depthstencil.c are used to extract the depth
401 ** and stencil values.
403 /* Change ZZZS -> SZZZ */
404 #define WRITE_DEPTH( _x, _y, d ) { \
405 GLuint tmp = ((d) >> 8) | ((d) << 24); \
406 *((GLuint *)y_tile_swizzle (irb, intel, _x, _y)) = tmp; \
409 /* Change SZZZ -> ZZZS */
410 #define READ_DEPTH( d, _x, _y ) { \
411 GLuint tmp = *((GLuint *)y_tile_swizzle (irb, intel, _x, _y)); \
412 d = (tmp << 8) | (tmp >> 24); \
415 #define TAG(x) intel_YTile_##x##_z24_s8
416 #include "depthtmp.h"
420 ** 8-bit stencil function (XXX FBO: This is obsolete)
422 #define WRITE_STENCIL( _x, _y, d ) { \
423 GLuint tmp = ((GLuint *)buf)[(_x) + (_y) * pitch]; \
425 tmp |= ((d) << 24); \
426 ((GLuint *) buf)[(_x) + (_y) * pitch] = tmp; \
429 #define READ_STENCIL( d, _x, _y ) \
430 d = ((GLuint *)buf)[(_x) + (_y) * pitch] >> 24;
432 #define TAG(x) intel##x##_z24_s8
433 #include "stenciltmp.h"
436 ** 8-bit x-tile stencil function (XXX FBO: This is obsolete)
438 #define WRITE_STENCIL( _x, _y, d ) { \
439 GLuint *a = (GLuint *) x_tile_swizzle (irb, intel, _x, _y); \
442 tmp |= ((d) << 24); \
446 #define READ_STENCIL( d, _x, _y ) \
447 (d = *((GLuint*) x_tile_swizzle (irb, intel, _x, _y)) >> 24)
449 #define TAG(x) intel_XTile_##x##_z24_s8
450 #include "stenciltmp.h"
453 ** 8-bit y-tile stencil function (XXX FBO: This is obsolete)
455 #define WRITE_STENCIL( _x, _y, d ) { \
456 GLuint *a = (GLuint *) y_tile_swizzle (irb, intel, _x, _y); \
459 tmp |= ((d) << 24); \
463 #define READ_STENCIL( d, _x, _y ) \
464 (d = *((GLuint*) y_tile_swizzle (irb, intel, _x, _y)) >> 24)
466 #define TAG(x) intel_YTile_##x##_z24_s8
467 #include "stenciltmp.h"
472 * Map or unmap all the renderbuffers which we may need during
473 * software rendering.
474 * XXX in the future, we could probably convey extra information to
475 * reduce the number of mappings needed. I.e. if doing a glReadPixels
476 * from the depth buffer, we really only need one mapping.
478 * XXX Rewrite this function someday.
479 * We can probably just loop over all the renderbuffer attachments,
480 * map/unmap all of them, and not worry about the _ColorDrawBuffers
481 * _ColorReadBuffer, _DepthBuffer or _StencilBuffer fields.
484 intel_map_unmap_buffers(struct intel_context
*intel
, GLboolean map
)
486 GLcontext
*ctx
= &intel
->ctx
;
488 struct intel_renderbuffer
*irb
;
490 /* color draw buffers */
491 for (j
= 0; j
< ctx
->DrawBuffer
->_NumColorDrawBuffers
; j
++) {
492 struct gl_renderbuffer
*rb
= ctx
->DrawBuffer
->_ColorDrawBuffers
[j
];
493 irb
= intel_renderbuffer(rb
);
495 /* this is a user-created intel_renderbuffer */
498 intel_region_map(intel
, irb
->region
);
500 intel_region_unmap(intel
, irb
->region
);
501 irb
->pfMap
= irb
->region
->map
;
502 irb
->pfPitch
= irb
->region
->pitch
;
507 /* check for render to textures */
508 for (i
= 0; i
< BUFFER_COUNT
; i
++) {
509 struct gl_renderbuffer_attachment
*att
=
510 ctx
->DrawBuffer
->Attachment
+ i
;
511 struct gl_texture_object
*tex
= att
->Texture
;
513 /* render to texture */
514 ASSERT(att
->Renderbuffer
);
516 struct gl_texture_image
*texImg
;
517 texImg
= tex
->Image
[att
->CubeMapFace
][att
->TextureLevel
];
518 intel_tex_map_images(intel
, intel_texture_object(tex
));
521 intel_tex_unmap_images(intel
, intel_texture_object(tex
));
526 /* color read buffers */
527 irb
= intel_renderbuffer(ctx
->ReadBuffer
->_ColorReadBuffer
);
528 if (irb
&& irb
->region
) {
530 intel_region_map(intel
, irb
->region
);
532 intel_region_unmap(intel
, irb
->region
);
533 irb
->pfMap
= irb
->region
->map
;
534 irb
->pfPitch
= irb
->region
->pitch
;
537 /* Account for front/back color page flipping.
538 * The span routines use the pfMap and pfPitch fields which will
539 * swap the front/back region map/pitch if we're page flipped.
540 * Do this after mapping, above, so the map field is valid.
543 if (map
&& ctx
->DrawBuffer
->Name
== 0) {
544 struct intel_renderbuffer
*irbFront
545 = intel_get_renderbuffer(ctx
->DrawBuffer
, BUFFER_FRONT_LEFT
);
546 struct intel_renderbuffer
*irbBack
547 = intel_get_renderbuffer(ctx
->DrawBuffer
, BUFFER_BACK_LEFT
);
549 /* double buffered */
550 if (intel
->sarea
->pf_current_page
== 0) {
551 irbFront
->pfMap
= irbFront
->region
->map
;
552 irbFront
->pfPitch
= irbFront
->region
->pitch
;
553 irbBack
->pfMap
= irbBack
->region
->map
;
554 irbBack
->pfPitch
= irbBack
->region
->pitch
;
557 irbFront
->pfMap
= irbBack
->region
->map
;
558 irbFront
->pfPitch
= irbBack
->region
->pitch
;
559 irbBack
->pfMap
= irbFront
->region
->map
;
560 irbBack
->pfPitch
= irbFront
->region
->pitch
;
566 /* depth buffer (Note wrapper!) */
567 if (ctx
->DrawBuffer
->_DepthBuffer
) {
568 irb
= intel_renderbuffer(ctx
->DrawBuffer
->_DepthBuffer
->Wrapped
);
569 if (irb
&& irb
->region
) {
571 intel_region_map(intel
, irb
->region
);
572 irb
->pfMap
= irb
->region
->map
;
573 irb
->pfPitch
= irb
->region
->pitch
;
576 intel_region_unmap(intel
, irb
->region
);
577 irb
->pfMap
= irb
->region
->map
;
578 irb
->pfPitch
= irb
->region
->pitch
;
583 /* stencil buffer (Note wrapper!) */
584 if (ctx
->DrawBuffer
->_StencilBuffer
) {
585 irb
= intel_renderbuffer(ctx
->DrawBuffer
->_StencilBuffer
->Wrapped
);
586 if (irb
&& irb
->region
) {
588 intel_region_map(intel
, irb
->region
);
589 irb
->pfMap
= irb
->region
->map
;
590 irb
->pfPitch
= irb
->region
->pitch
;
593 intel_region_unmap(intel
, irb
->region
);
594 irb
->pfMap
= irb
->region
->map
;
595 irb
->pfPitch
= irb
->region
->pitch
;
604 * Prepare for softare rendering. Map current read/draw framebuffers'
605 * renderbuffes and all currently bound texture objects.
607 * Old note: Moved locking out to get reasonable span performance.
610 intelSpanRenderStart(GLcontext
* ctx
)
612 struct intel_context
*intel
= intel_context(ctx
);
615 intelFinish(&intel
->ctx
);
616 LOCK_HARDWARE(intel
);
619 /* Just map the framebuffer and all textures. Bufmgr code will
620 * take care of waiting on the necessary fences:
622 intel_region_map(intel
, intel
->front_region
);
623 intel_region_map(intel
, intel
->back_region
);
624 intel_region_map(intel
, intel
->depth_region
);
627 for (i
= 0; i
< ctx
->Const
.MaxTextureCoordUnits
; i
++) {
628 if (ctx
->Texture
.Unit
[i
]._ReallyEnabled
) {
629 struct gl_texture_object
*texObj
= ctx
->Texture
.Unit
[i
]._Current
;
630 intel_tex_map_images(intel
, intel_texture_object(texObj
));
634 intel_map_unmap_buffers(intel
, GL_TRUE
);
638 * Called when done softare rendering. Unmap the buffers we mapped in
639 * the above function.
642 intelSpanRenderFinish(GLcontext
* ctx
)
644 struct intel_context
*intel
= intel_context(ctx
);
649 /* Now unmap the framebuffer:
652 intel_region_unmap(intel
, intel
->front_region
);
653 intel_region_unmap(intel
, intel
->back_region
);
654 intel_region_unmap(intel
, intel
->depth_region
);
657 for (i
= 0; i
< ctx
->Const
.MaxTextureCoordUnits
; i
++) {
658 if (ctx
->Texture
.Unit
[i
]._ReallyEnabled
) {
659 struct gl_texture_object
*texObj
= ctx
->Texture
.Unit
[i
]._Current
;
660 intel_tex_unmap_images(intel
, intel_texture_object(texObj
));
664 intel_map_unmap_buffers(intel
, GL_FALSE
);
666 UNLOCK_HARDWARE(intel
);
671 intelInitSpanFuncs(GLcontext
* ctx
)
673 struct swrast_device_driver
*swdd
= _swrast_GetDeviceDriverReference(ctx
);
674 swdd
->SpanRenderStart
= intelSpanRenderStart
;
675 swdd
->SpanRenderFinish
= intelSpanRenderFinish
;
680 * Plug in appropriate span read/write functions for the given renderbuffer.
681 * These are used for the software fallbacks.
684 intel_set_span_functions(struct gl_renderbuffer
*rb
, enum tiling_mode tiling
)
686 if (rb
->_ActualFormat
== GL_RGB5
) {
689 case INTEL_TILE_NONE
:
691 intelInitPointers_RGB565(rb
);
694 intel_XTile_InitPointers_RGB565(rb
);
697 intel_YTile_InitPointers_RGB565(rb
);
701 else if (rb
->_ActualFormat
== GL_RGBA8
) {
704 case INTEL_TILE_NONE
:
706 intelInitPointers_ARGB8888(rb
);
709 intel_XTile_InitPointers_ARGB8888(rb
);
712 intel_YTile_InitPointers_ARGB8888(rb
);
716 else if (rb
->_ActualFormat
== GL_DEPTH_COMPONENT16
) {
718 case INTEL_TILE_NONE
:
720 intelInitDepthPointers_z16(rb
);
723 intel_XTile_InitDepthPointers_z16(rb
);
726 intel_YTile_InitDepthPointers_z16(rb
);
730 else if (rb
->_ActualFormat
== GL_DEPTH_COMPONENT24
|| /* XXX FBO remove */
731 rb
->_ActualFormat
== GL_DEPTH24_STENCIL8_EXT
) {
733 case INTEL_TILE_NONE
:
735 intelInitDepthPointers_z24_s8(rb
);
738 intel_XTile_InitDepthPointers_z24_s8(rb
);
741 intel_YTile_InitDepthPointers_z24_s8(rb
);
745 else if (rb
->_ActualFormat
== GL_STENCIL_INDEX8_EXT
) {
747 case INTEL_TILE_NONE
:
749 intelInitStencilPointers_z24_s8(rb
);
752 intel_XTile_InitStencilPointers_z24_s8(rb
);
755 intel_YTile_InitStencilPointers_z24_s8(rb
);
761 "Unexpected _ActualFormat in intelSetSpanFunctions");