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
) << 3;
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) + (x_tile_off
& 0xf);
185 tile_base
= (x_tile_number
<< 12) + y_tile_number
* tile_stride
;
187 return buf
+ tile_base
+ tile_off
;
191 break intelWriteRGBASpan_ARGB8888
198 struct intel_context *intel = intel_context(ctx); \
199 struct intel_renderbuffer *irb = intel_renderbuffer(rb); \
200 const GLint yScale = irb->RenderToTexture ? 1 : -1; \
201 const GLint yBias = irb->RenderToTexture ? 0 : irb->Base.Height - 1; \
202 GLubyte *buf = (GLubyte *) irb->pfMap \
203 + (intel->drawY * irb->pfPitch + intel->drawX) * irb->region->cpp;\
206 (void) p; (void) buf;
208 /* XXX FBO: this is identical to the macro in spantmp2.h except we get
209 * the cliprect info from the context, not the driDrawable.
210 * Move this into spantmp2.h someday.
212 #define HW_CLIPLOOP() \
214 int _nc = intel->numClipRects; \
216 int minx = intel->pClipRects[_nc].x1 - intel->drawX; \
217 int miny = intel->pClipRects[_nc].y1 - intel->drawY; \
218 int maxx = intel->pClipRects[_nc].x2 - intel->drawX; \
219 int maxy = intel->pClipRects[_nc].y2 - intel->drawY;
225 #define Y_FLIP(_y) ((_y) * yScale + yBias)
227 /* XXX with GEM, these need to tell the kernel */
232 /* 16 bit, RGB565 color spanline and pixel functions
234 #define SPANTMP_PIXEL_FMT GL_RGB
235 #define SPANTMP_PIXEL_TYPE GL_UNSIGNED_SHORT_5_6_5
237 #define TAG(x) intel##x##_RGB565
238 #define TAG2(x,y) intel##x##_RGB565##y
239 #define GET_PTR(X,Y) (buf + ((Y) * irb->pfPitch + (X)) * 2)
240 #include "spantmp2.h"
242 /* 32 bit, ARGB8888 color spanline and pixel functions
244 #define SPANTMP_PIXEL_FMT GL_BGRA
245 #define SPANTMP_PIXEL_TYPE GL_UNSIGNED_INT_8_8_8_8_REV
247 #define TAG(x) intel##x##_ARGB8888
248 #define TAG2(x,y) intel##x##_ARGB8888##y
249 #define GET_PTR(X,Y) (buf + ((Y) * irb->pfPitch + (X)) * 4)
250 #include "spantmp2.h"
252 /* 16 bit RGB565 color tile spanline and pixel functions
255 #define SPANTMP_PIXEL_FMT GL_RGB
256 #define SPANTMP_PIXEL_TYPE GL_UNSIGNED_SHORT_5_6_5
258 #define TAG(x) intel_XTile_##x##_RGB565
259 #define TAG2(x,y) intel_XTile_##x##_RGB565##y
260 #define GET_PTR(X,Y) x_tile_swizzle(irb, intel, X, Y)
261 #include "spantmp2.h"
263 #define SPANTMP_PIXEL_FMT GL_RGB
264 #define SPANTMP_PIXEL_TYPE GL_UNSIGNED_SHORT_5_6_5
266 #define TAG(x) intel_YTile_##x##_RGB565
267 #define TAG2(x,y) intel_YTile_##x##_RGB565##y
268 #define GET_PTR(X,Y) y_tile_swizzle(irb, intel, X, Y)
269 #include "spantmp2.h"
271 /* 32 bit ARGB888 color tile spanline and pixel functions
274 #define SPANTMP_PIXEL_FMT GL_BGRA
275 #define SPANTMP_PIXEL_TYPE GL_UNSIGNED_INT_8_8_8_8_REV
277 #define TAG(x) intel_XTile_##x##_ARGB8888
278 #define TAG2(x,y) intel_XTile_##x##_ARGB8888##y
279 #define GET_PTR(X,Y) x_tile_swizzle(irb, intel, X, Y)
280 #include "spantmp2.h"
282 #define SPANTMP_PIXEL_FMT GL_BGRA
283 #define SPANTMP_PIXEL_TYPE GL_UNSIGNED_INT_8_8_8_8_REV
285 #define TAG(x) intel_YTile_##x##_ARGB8888
286 #define TAG2(x,y) intel_YTile_##x##_ARGB8888##y
287 #define GET_PTR(X,Y) y_tile_swizzle(irb, intel, X, Y)
288 #include "spantmp2.h"
290 #define LOCAL_DEPTH_VARS \
291 struct intel_context *intel = intel_context(ctx); \
292 struct intel_renderbuffer *irb = intel_renderbuffer(rb); \
293 const GLuint pitch = irb->pfPitch/***XXX region->pitch*/; /* in pixels */ \
294 const GLint yScale = irb->RenderToTexture ? 1 : -1; \
295 const GLint yBias = irb->RenderToTexture ? 0 : irb->Base.Height - 1; \
296 char *buf = (char *) irb->pfMap/*XXX use region->map*/ + \
297 (intel->drawY * pitch + intel->drawX) * irb->region->cpp; (void) buf;
300 #define LOCAL_STENCIL_VARS LOCAL_DEPTH_VARS
303 ** 16-bit depthbuffer functions.
305 #define WRITE_DEPTH( _x, _y, d ) \
306 ((GLushort *)buf)[(_x) + (_y) * pitch] = d;
308 #define READ_DEPTH( d, _x, _y ) \
309 d = ((GLushort *)buf)[(_x) + (_y) * pitch];
312 #define TAG(x) intel##x##_z16
313 #include "depthtmp.h"
317 ** 16-bit x tile depthbuffer functions.
319 #define WRITE_DEPTH( _x, _y, d ) \
320 (*((GLushort *)x_tile_swizzle (irb, intel, _x, _y)) = d)
322 #define READ_DEPTH( d, _x, _y ) \
323 d = *((GLushort *)x_tile_swizzle (irb, intel, _x, _y))
326 #define TAG(x) intel_XTile_##x##_z16
327 #include "depthtmp.h"
330 ** 16-bit y tile depthbuffer functions.
332 #define WRITE_DEPTH( _x, _y, d ) \
333 (*((GLushort *)y_tile_swizzle (irb, intel, _x, _y)) = d)
335 #define READ_DEPTH( d, _x, _y ) \
336 (d = *((GLushort *)y_tile_swizzle (irb, intel, _x, _y)))
339 #define TAG(x) intel_YTile_##x##_z16
340 #include "depthtmp.h"
344 ** 24/8-bit interleaved depth/stencil functions
345 ** Note: we're actually reading back combined depth+stencil values.
346 ** The wrappers in main/depthstencil.c are used to extract the depth
347 ** and stencil values.
349 /* Change ZZZS -> SZZZ */
350 #define WRITE_DEPTH( _x, _y, d ) { \
351 GLuint tmp = ((d) >> 8) | ((d) << 24); \
352 ((GLuint *)buf)[(_x) + (_y) * pitch] = tmp; \
355 /* Change SZZZ -> ZZZS */
356 #define READ_DEPTH( d, _x, _y ) { \
357 GLuint tmp = ((GLuint *)buf)[(_x) + (_y) * pitch]; \
358 d = (tmp << 8) | (tmp >> 24); \
361 #define TAG(x) intel##x##_z24_s8
362 #include "depthtmp.h"
366 ** 24/8-bit x-tile interleaved depth/stencil functions
367 ** Note: we're actually reading back combined depth+stencil values.
368 ** The wrappers in main/depthstencil.c are used to extract the depth
369 ** and stencil values.
371 /* Change ZZZS -> SZZZ */
372 #define WRITE_DEPTH( _x, _y, d ) { \
373 GLuint tmp = ((d) >> 8) | ((d) << 24); \
374 *((GLuint *)x_tile_swizzle (irb, intel, _x, _y)) = tmp; \
377 /* Change SZZZ -> ZZZS */
378 #define READ_DEPTH( d, _x, _y ) { \
379 GLuint tmp = *((GLuint *)x_tile_swizzle (irb, intel, _x, _y)); \
380 d = (tmp << 8) | (tmp >> 24); \
383 #define TAG(x) intel_XTile_##x##_z24_s8
384 #include "depthtmp.h"
387 ** 24/8-bit y-tile interleaved depth/stencil functions
388 ** Note: we're actually reading back combined depth+stencil values.
389 ** The wrappers in main/depthstencil.c are used to extract the depth
390 ** and stencil values.
392 /* Change ZZZS -> SZZZ */
393 #define WRITE_DEPTH( _x, _y, d ) { \
394 GLuint tmp = ((d) >> 8) | ((d) << 24); \
395 *((GLuint *)y_tile_swizzle (irb, intel, _x, _y)) = tmp; \
398 /* Change SZZZ -> ZZZS */
399 #define READ_DEPTH( d, _x, _y ) { \
400 GLuint tmp = *((GLuint *)y_tile_swizzle (irb, intel, _x, _y)); \
401 d = (tmp << 8) | (tmp >> 24); \
404 #define TAG(x) intel_YTile_##x##_z24_s8
405 #include "depthtmp.h"
409 ** 8-bit stencil function (XXX FBO: This is obsolete)
411 #define WRITE_STENCIL( _x, _y, d ) { \
412 GLuint tmp = ((GLuint *)buf)[(_x) + (_y) * pitch]; \
414 tmp |= ((d) << 24); \
415 ((GLuint *) buf)[(_x) + (_y) * pitch] = tmp; \
418 #define READ_STENCIL( d, _x, _y ) \
419 d = ((GLuint *)buf)[(_x) + (_y) * pitch] >> 24;
421 #define TAG(x) intel##x##_z24_s8
422 #include "stenciltmp.h"
425 ** 8-bit x-tile stencil function (XXX FBO: This is obsolete)
427 #define WRITE_STENCIL( _x, _y, d ) { \
428 GLuint *a = (GLuint *) x_tile_swizzle (irb, intel, _x, _y); \
431 tmp |= ((d) << 24); \
435 #define READ_STENCIL( d, _x, _y ) \
436 (d = *((GLuint*) x_tile_swizzle (irb, intel, _x, _y)) >> 24)
438 #define TAG(x) intel_XTile_##x##_z24_s8
439 #include "stenciltmp.h"
442 ** 8-bit y-tile stencil function (XXX FBO: This is obsolete)
444 #define WRITE_STENCIL( _x, _y, d ) { \
445 GLuint *a = (GLuint *) y_tile_swizzle (irb, intel, _x, _y); \
448 tmp |= ((d) << 24); \
452 #define READ_STENCIL( d, _x, _y ) \
453 (d = *((GLuint*) y_tile_swizzle (irb, intel, _x, _y)) >> 24)
455 #define TAG(x) intel_YTile_##x##_z24_s8
456 #include "stenciltmp.h"
461 * Map or unmap all the renderbuffers which we may need during
462 * software rendering.
463 * XXX in the future, we could probably convey extra information to
464 * reduce the number of mappings needed. I.e. if doing a glReadPixels
465 * from the depth buffer, we really only need one mapping.
467 * XXX Rewrite this function someday.
468 * We can probably just loop over all the renderbuffer attachments,
469 * map/unmap all of them, and not worry about the _ColorDrawBuffers
470 * _ColorReadBuffer, _DepthBuffer or _StencilBuffer fields.
473 intel_map_unmap_buffers(struct intel_context
*intel
, GLboolean map
)
475 GLcontext
*ctx
= &intel
->ctx
;
477 struct intel_renderbuffer
*irb
;
479 /* color draw buffers */
480 for (j
= 0; j
< ctx
->DrawBuffer
->_NumColorDrawBuffers
; j
++) {
481 struct gl_renderbuffer
*rb
= ctx
->DrawBuffer
->_ColorDrawBuffers
[j
];
482 irb
= intel_renderbuffer(rb
);
484 /* this is a user-created intel_renderbuffer */
487 intel_region_map(intel
, irb
->region
);
489 intel_region_unmap(intel
, irb
->region
);
490 irb
->pfMap
= irb
->region
->map
;
491 irb
->pfPitch
= irb
->region
->pitch
;
496 /* check for render to textures */
497 for (i
= 0; i
< BUFFER_COUNT
; i
++) {
498 struct gl_renderbuffer_attachment
*att
=
499 ctx
->DrawBuffer
->Attachment
+ i
;
500 struct gl_texture_object
*tex
= att
->Texture
;
502 /* render to texture */
503 ASSERT(att
->Renderbuffer
);
505 struct gl_texture_image
*texImg
;
506 texImg
= tex
->Image
[att
->CubeMapFace
][att
->TextureLevel
];
507 intel_tex_map_images(intel
, intel_texture_object(tex
));
510 intel_tex_unmap_images(intel
, intel_texture_object(tex
));
515 /* color read buffers */
516 irb
= intel_renderbuffer(ctx
->ReadBuffer
->_ColorReadBuffer
);
517 if (irb
&& irb
->region
) {
519 intel_region_map(intel
, irb
->region
);
521 intel_region_unmap(intel
, irb
->region
);
522 irb
->pfMap
= irb
->region
->map
;
523 irb
->pfPitch
= irb
->region
->pitch
;
526 /* Account for front/back color page flipping.
527 * The span routines use the pfMap and pfPitch fields which will
528 * swap the front/back region map/pitch if we're page flipped.
529 * Do this after mapping, above, so the map field is valid.
532 if (map
&& ctx
->DrawBuffer
->Name
== 0) {
533 struct intel_renderbuffer
*irbFront
534 = intel_get_renderbuffer(ctx
->DrawBuffer
, BUFFER_FRONT_LEFT
);
535 struct intel_renderbuffer
*irbBack
536 = intel_get_renderbuffer(ctx
->DrawBuffer
, BUFFER_BACK_LEFT
);
538 /* double buffered */
539 if (intel
->sarea
->pf_current_page
== 0) {
540 irbFront
->pfMap
= irbFront
->region
->map
;
541 irbFront
->pfPitch
= irbFront
->region
->pitch
;
542 irbBack
->pfMap
= irbBack
->region
->map
;
543 irbBack
->pfPitch
= irbBack
->region
->pitch
;
546 irbFront
->pfMap
= irbBack
->region
->map
;
547 irbFront
->pfPitch
= irbBack
->region
->pitch
;
548 irbBack
->pfMap
= irbFront
->region
->map
;
549 irbBack
->pfPitch
= irbFront
->region
->pitch
;
555 /* depth buffer (Note wrapper!) */
556 if (ctx
->DrawBuffer
->_DepthBuffer
) {
557 irb
= intel_renderbuffer(ctx
->DrawBuffer
->_DepthBuffer
->Wrapped
);
558 if (irb
&& irb
->region
) {
560 intel_region_map(intel
, irb
->region
);
561 irb
->pfMap
= irb
->region
->map
;
562 irb
->pfPitch
= irb
->region
->pitch
;
565 intel_region_unmap(intel
, irb
->region
);
566 irb
->pfMap
= irb
->region
->map
;
567 irb
->pfPitch
= irb
->region
->pitch
;
572 /* stencil buffer (Note wrapper!) */
573 if (ctx
->DrawBuffer
->_StencilBuffer
) {
574 irb
= intel_renderbuffer(ctx
->DrawBuffer
->_StencilBuffer
->Wrapped
);
575 if (irb
&& irb
->region
) {
577 intel_region_map(intel
, irb
->region
);
578 irb
->pfMap
= irb
->region
->map
;
579 irb
->pfPitch
= irb
->region
->pitch
;
582 intel_region_unmap(intel
, irb
->region
);
583 irb
->pfMap
= irb
->region
->map
;
584 irb
->pfPitch
= irb
->region
->pitch
;
593 * Prepare for softare rendering. Map current read/draw framebuffers'
594 * renderbuffes and all currently bound texture objects.
596 * Old note: Moved locking out to get reasonable span performance.
599 intelSpanRenderStart(GLcontext
* ctx
)
601 struct intel_context
*intel
= intel_context(ctx
);
604 intelFinish(&intel
->ctx
);
605 LOCK_HARDWARE(intel
);
608 /* Just map the framebuffer and all textures. Bufmgr code will
609 * take care of waiting on the necessary fences:
611 intel_region_map(intel
, intel
->front_region
);
612 intel_region_map(intel
, intel
->back_region
);
613 intel_region_map(intel
, intel
->depth_region
);
616 for (i
= 0; i
< ctx
->Const
.MaxTextureCoordUnits
; i
++) {
617 if (ctx
->Texture
.Unit
[i
]._ReallyEnabled
) {
618 struct gl_texture_object
*texObj
= ctx
->Texture
.Unit
[i
]._Current
;
619 intel_tex_map_images(intel
, intel_texture_object(texObj
));
623 intel_map_unmap_buffers(intel
, GL_TRUE
);
627 * Called when done softare rendering. Unmap the buffers we mapped in
628 * the above function.
631 intelSpanRenderFinish(GLcontext
* ctx
)
633 struct intel_context
*intel
= intel_context(ctx
);
638 /* Now unmap the framebuffer:
641 intel_region_unmap(intel
, intel
->front_region
);
642 intel_region_unmap(intel
, intel
->back_region
);
643 intel_region_unmap(intel
, intel
->depth_region
);
646 for (i
= 0; i
< ctx
->Const
.MaxTextureCoordUnits
; i
++) {
647 if (ctx
->Texture
.Unit
[i
]._ReallyEnabled
) {
648 struct gl_texture_object
*texObj
= ctx
->Texture
.Unit
[i
]._Current
;
649 intel_tex_unmap_images(intel
, intel_texture_object(texObj
));
653 intel_map_unmap_buffers(intel
, GL_FALSE
);
655 UNLOCK_HARDWARE(intel
);
660 intelInitSpanFuncs(GLcontext
* ctx
)
662 struct swrast_device_driver
*swdd
= _swrast_GetDeviceDriverReference(ctx
);
663 swdd
->SpanRenderStart
= intelSpanRenderStart
;
664 swdd
->SpanRenderFinish
= intelSpanRenderFinish
;
669 * Plug in appropriate span read/write functions for the given renderbuffer.
670 * These are used for the software fallbacks.
673 intel_set_span_functions(struct gl_renderbuffer
*rb
, int tiling
)
675 if (rb
->_ActualFormat
== GL_RGB5
) {
678 case INTEL_TILE_NONE
:
680 intelInitPointers_RGB565(rb
);
683 intel_XTile_InitPointers_RGB565(rb
);
686 intel_YTile_InitPointers_RGB565(rb
);
690 else if (rb
->_ActualFormat
== GL_RGBA8
) {
693 case INTEL_TILE_NONE
:
695 intelInitPointers_ARGB8888(rb
);
698 intel_XTile_InitPointers_ARGB8888(rb
);
701 intel_YTile_InitPointers_ARGB8888(rb
);
705 else if (rb
->_ActualFormat
== GL_DEPTH_COMPONENT16
) {
707 case INTEL_TILE_NONE
:
709 intelInitDepthPointers_z16(rb
);
712 intel_XTile_InitDepthPointers_z16(rb
);
715 intel_YTile_InitDepthPointers_z16(rb
);
719 else if (rb
->_ActualFormat
== GL_DEPTH_COMPONENT24
|| /* XXX FBO remove */
720 rb
->_ActualFormat
== GL_DEPTH24_STENCIL8_EXT
) {
722 case INTEL_TILE_NONE
:
724 intelInitDepthPointers_z24_s8(rb
);
727 intel_XTile_InitDepthPointers_z24_s8(rb
);
730 intel_YTile_InitDepthPointers_z24_s8(rb
);
734 else if (rb
->_ActualFormat
== GL_STENCIL_INDEX8_EXT
) {
736 case INTEL_TILE_NONE
:
738 intelInitStencilPointers_z24_s8(rb
);
741 intel_XTile_InitStencilPointers_z24_s8(rb
);
744 intel_YTile_InitStencilPointers_z24_s8(rb
);
750 "Unexpected _ActualFormat in intelSetSpanFunctions");