1 /**************************************************************************
3 Copyright 2000, 2001 ATI Technologies Inc., Ontario, Canada, and
4 VA Linux Systems Inc., Fremont, California.
5 Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved.
7 The Weather Channel (TM) funded Tungsten Graphics to develop the
8 initial release of the Radeon 8500 driver under the XFree86 license.
9 This notice must be preserved.
13 Permission is hereby granted, free of charge, to any person obtaining
14 a copy of this software and associated documentation files (the
15 "Software"), to deal in the Software without restriction, including
16 without limitation the rights to use, copy, modify, merge, publish,
17 distribute, sublicense, and/or sell copies of the Software, and to
18 permit persons to whom the Software is furnished to do so, subject to
19 the following conditions:
21 The above copyright notice and this permission notice (including the
22 next paragraph) shall be included in all copies or substantial
23 portions of the Software.
25 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
28 IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
29 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
30 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
31 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
33 **************************************************************************/
35 #include "radeon_common.h"
36 #include "xmlpool.h" /* for symbolic values of enum-type options */
39 #include "drirenderbuffer.h"
40 #include "main/context.h"
41 #include "main/framebuffer.h"
42 #include "main/renderbuffer.h"
43 #include "main/state.h"
44 #include "main/simple_list.h"
45 #include "swrast/swrast.h"
46 #include "swrast_setup/swrast_setup.h"
49 #if RADEON_COMMON && defined(RADEON_COMMON_FOR_R600) /* +r6/r7 */
50 #include "r600_context.h"
53 #define DRIVER_DATE "20090101"
56 int RADEON_DEBUG
= (0);
60 static const char* get_chip_family_name(int chip_family
)
63 case CHIP_FAMILY_R100
: return "R100";
64 case CHIP_FAMILY_RV100
: return "RV100";
65 case CHIP_FAMILY_RS100
: return "RS100";
66 case CHIP_FAMILY_RV200
: return "RV200";
67 case CHIP_FAMILY_RS200
: return "RS200";
68 case CHIP_FAMILY_R200
: return "R200";
69 case CHIP_FAMILY_RV250
: return "RV250";
70 case CHIP_FAMILY_RS300
: return "RS300";
71 case CHIP_FAMILY_RV280
: return "RV280";
72 case CHIP_FAMILY_R300
: return "R300";
73 case CHIP_FAMILY_R350
: return "R350";
74 case CHIP_FAMILY_RV350
: return "RV350";
75 case CHIP_FAMILY_RV380
: return "RV380";
76 case CHIP_FAMILY_R420
: return "R420";
77 case CHIP_FAMILY_RV410
: return "RV410";
78 case CHIP_FAMILY_RS400
: return "RS400";
79 case CHIP_FAMILY_RS600
: return "RS600";
80 case CHIP_FAMILY_RS690
: return "RS690";
81 case CHIP_FAMILY_RS740
: return "RS740";
82 case CHIP_FAMILY_RV515
: return "RV515";
83 case CHIP_FAMILY_R520
: return "R520";
84 case CHIP_FAMILY_RV530
: return "RV530";
85 case CHIP_FAMILY_R580
: return "R580";
86 case CHIP_FAMILY_RV560
: return "RV560";
87 case CHIP_FAMILY_RV570
: return "RV570";
88 case CHIP_FAMILY_R600
: return "R600";
89 case CHIP_FAMILY_RV610
: return "RV610";
90 case CHIP_FAMILY_RV630
: return "RV630";
91 case CHIP_FAMILY_RV670
: return "RV670";
92 case CHIP_FAMILY_RV620
: return "RV620";
93 case CHIP_FAMILY_RV635
: return "RV635";
94 case CHIP_FAMILY_RS780
: return "RS780";
95 case CHIP_FAMILY_RV770
: return "RV770";
96 case CHIP_FAMILY_RV730
: return "RV730";
97 case CHIP_FAMILY_RV710
: return "RV710";
98 case CHIP_FAMILY_RV740
: return "RV740";
99 default: return "unknown";
104 /* Return various strings for glGetString().
106 static const GLubyte
*radeonGetString(GLcontext
* ctx
, GLenum name
)
108 radeonContextPtr radeon
= RADEON_CONTEXT(ctx
);
109 static char buffer
[128];
113 if (IS_R600_CLASS(radeon
->radeonScreen
))
114 return (GLubyte
*) "Advanced Micro Devices, Inc.";
115 else if (IS_R300_CLASS(radeon
->radeonScreen
))
116 return (GLubyte
*) "DRI R300 Project";
118 return (GLubyte
*) "Tungsten Graphics, Inc.";
123 GLuint agp_mode
= (radeon
->radeonScreen
->card_type
==RADEON_CARD_PCI
) ? 0 :
124 radeon
->radeonScreen
->AGPMode
;
125 const char* chipclass
;
126 char hardwarename
[32];
128 if (IS_R600_CLASS(radeon
->radeonScreen
))
130 else if (IS_R300_CLASS(radeon
->radeonScreen
))
132 else if (IS_R200_CLASS(radeon
->radeonScreen
))
137 sprintf(hardwarename
, "%s (%s %04X)",
139 get_chip_family_name(radeon
->radeonScreen
->chip_family
),
140 radeon
->radeonScreen
->device_id
);
142 offset
= driGetRendererString(buffer
, hardwarename
, DRIVER_DATE
,
145 if (IS_R600_CLASS(radeon
->radeonScreen
)) {
146 sprintf(&buffer
[offset
], " TCL");
147 } else if (IS_R300_CLASS(radeon
->radeonScreen
)) {
148 sprintf(&buffer
[offset
], " %sTCL",
149 (radeon
->radeonScreen
->chip_flags
& RADEON_CHIPSET_TCL
)
152 sprintf(&buffer
[offset
], " %sTCL",
153 !(radeon
->TclFallback
& RADEON_TCL_FALLBACK_TCL_DISABLE
)
157 if (radeon
->radeonScreen
->driScreen
->dri2
.enabled
)
158 strcat(buffer
, " DRI2");
160 return (GLubyte
*) buffer
;
168 /* Initialize the driver's misc functions.
170 static void radeonInitDriverFuncs(struct dd_function_table
*functions
)
172 functions
->GetString
= radeonGetString
;
176 * Create and initialize all common fields of the context,
177 * including the Mesa context itself.
179 GLboolean
radeonInitContext(radeonContextPtr radeon
,
180 struct dd_function_table
* functions
,
181 const __GLcontextModes
* glVisual
,
182 __DRIcontextPrivate
* driContextPriv
,
183 void *sharedContextPrivate
)
185 __DRIscreenPrivate
*sPriv
= driContextPriv
->driScreenPriv
;
186 radeonScreenPtr screen
= (radeonScreenPtr
) (sPriv
->private);
191 /* Fill in additional standard functions. */
192 radeonInitDriverFuncs(functions
);
194 radeon
->radeonScreen
= screen
;
195 /* Allocate and initialize the Mesa context */
196 if (sharedContextPrivate
)
197 shareCtx
= ((radeonContextPtr
)sharedContextPrivate
)->glCtx
;
200 radeon
->glCtx
= _mesa_create_context(glVisual
, shareCtx
,
201 functions
, (void *)radeon
);
206 driContextPriv
->driverPrivate
= radeon
;
208 meta_init_metaops(ctx
, &radeon
->meta
);
210 radeon
->dri
.context
= driContextPriv
;
211 radeon
->dri
.screen
= sPriv
;
212 radeon
->dri
.hwContext
= driContextPriv
->hHWContext
;
213 radeon
->dri
.hwLock
= &sPriv
->pSAREA
->lock
;
214 radeon
->dri
.hwLockCount
= 0;
215 radeon
->dri
.fd
= sPriv
->fd
;
216 radeon
->dri
.drmMinor
= sPriv
->drm_version
.minor
;
218 radeon
->sarea
= (drm_radeon_sarea_t
*) ((GLubyte
*) sPriv
->pSAREA
+
219 screen
->sarea_priv_offset
);
222 fthrottle_mode
= driQueryOptioni(&radeon
->optionCache
, "fthrottle_mode");
223 radeon
->iw
.irq_seq
= -1;
224 radeon
->irqsEmitted
= 0;
225 if (IS_R600_CLASS(radeon
->radeonScreen
))
228 radeon
->do_irqs
= (fthrottle_mode
== DRI_CONF_FTHROTTLE_IRQS
&&
229 radeon
->radeonScreen
->irq
);
231 radeon
->do_usleeps
= (fthrottle_mode
== DRI_CONF_FTHROTTLE_USLEEPS
);
233 if (!radeon
->do_irqs
)
235 "IRQ's not enabled, falling back to %s: %d %d\n",
236 radeon
->do_usleeps
? "usleeps" : "busy waits",
237 fthrottle_mode
, radeon
->radeonScreen
->irq
);
239 radeon
->texture_depth
= driQueryOptioni (&radeon
->optionCache
,
241 if (radeon
->texture_depth
== DRI_CONF_TEXTURE_DEPTH_FB
)
242 radeon
->texture_depth
= ( glVisual
->rgbBits
> 16 ) ?
243 DRI_CONF_TEXTURE_DEPTH_32
: DRI_CONF_TEXTURE_DEPTH_16
;
245 if (IS_R600_CLASS(radeon
->radeonScreen
)) {
246 radeon
->texture_row_align
= 256;
247 radeon
->texture_rect_row_align
= 256;
248 radeon
->texture_compressed_row_align
= 256;
249 } else if (IS_R200_CLASS(radeon
->radeonScreen
) ||
250 IS_R100_CLASS(radeon
->radeonScreen
)) {
251 radeon
->texture_row_align
= 32;
252 radeon
->texture_rect_row_align
= 64;
253 radeon
->texture_compressed_row_align
= 32;
254 } else { /* R300 - not sure this is all correct */
255 int chip_family
= radeon
->radeonScreen
->chip_family
;
256 if (chip_family
== CHIP_FAMILY_RS600
||
257 chip_family
== CHIP_FAMILY_RS690
||
258 chip_family
== CHIP_FAMILY_RS740
)
259 radeon
->texture_row_align
= 64;
261 radeon
->texture_row_align
= 32;
262 radeon
->texture_rect_row_align
= 64;
263 radeon
->texture_compressed_row_align
= 64;
272 * Destroy the command buffer and state atoms.
274 static void radeon_destroy_atom_list(radeonContextPtr radeon
)
276 struct radeon_state_atom
*atom
;
278 foreach(atom
, &radeon
->hw
.atomlist
) {
287 * Cleanup common context fields.
288 * Called by r200DestroyContext/r300DestroyContext
290 void radeonDestroyContext(__DRIcontextPrivate
*driContextPriv
)
292 #ifdef RADEON_BO_TRACK
295 GET_CURRENT_CONTEXT(ctx
);
296 radeonContextPtr radeon
= (radeonContextPtr
) driContextPriv
->driverPrivate
;
297 radeonContextPtr current
= ctx
? RADEON_CONTEXT(ctx
) : NULL
;
300 __DRIscreenPrivate
*sPriv
= driContextPriv
->driScreenPriv
;
301 radeonScreenPtr screen
= (radeonScreenPtr
) (sPriv
->private);
304 if (radeon
== current
) {
305 radeon_firevertices(radeon
);
306 _mesa_make_current(NULL
, NULL
, NULL
);
313 #if RADEON_COMMON && defined(RADEON_COMMON_FOR_R600) /* +r6/r7 */
314 if (IS_R600_CLASS(screen
))
316 r600DestroyContext(driContextPriv
);
320 if (radeon
->dma
.current
) {
321 rcommonFlushCmdBuf( radeon
, __FUNCTION__
);
324 radeonReleaseArrays(radeon
->glCtx
, ~0);
325 meta_destroy_metaops(&radeon
->meta
);
326 if (radeon
->vtbl
.free_context
)
327 radeon
->vtbl
.free_context(radeon
->glCtx
);
328 _swsetup_DestroyContext( radeon
->glCtx
);
329 _tnl_DestroyContext( radeon
->glCtx
);
330 _vbo_DestroyContext( radeon
->glCtx
);
331 _swrast_DestroyContext( radeon
->glCtx
);
334 /* free the Mesa context */
335 _mesa_destroy_context(radeon
->glCtx
);
337 /* _mesa_destroy_context() might result in calls to functions that
338 * depend on the DriverCtx, so don't set it to NULL before.
340 * radeon->glCtx->DriverCtx = NULL;
342 /* free the option cache */
343 driDestroyOptionCache(&radeon
->optionCache
);
345 rcommonDestroyCmdBuf(radeon
);
347 #if RADEON_COMMON && defined(RADEON_COMMON_FOR_R600) /* +r6/r7 */
348 if (!IS_R600_CLASS(screen
))
350 radeon_destroy_atom_list(radeon
);
352 if (radeon
->state
.scissor
.pClipRects
) {
353 FREE(radeon
->state
.scissor
.pClipRects
);
354 radeon
->state
.scissor
.pClipRects
= 0;
357 #ifdef RADEON_BO_TRACK
358 track
= fopen("/tmp/tracklog", "w");
360 radeon_tracker_print(&radeon
->radeonScreen
->bom
->tracker
, track
);
367 /* Force the context `c' to be unbound from its buffer.
369 GLboolean
radeonUnbindContext(__DRIcontextPrivate
* driContextPriv
)
371 radeonContextPtr radeon
= (radeonContextPtr
) driContextPriv
->driverPrivate
;
373 if (RADEON_DEBUG
& DEBUG_DRI
)
374 fprintf(stderr
, "%s ctx %p\n", __FUNCTION__
,
382 radeon_make_kernel_renderbuffer_current(radeonContextPtr radeon
,
383 struct radeon_framebuffer
*draw
)
385 /* if radeon->fake */
386 struct radeon_renderbuffer
*rb
;
388 if ((rb
= (void *)draw
->base
.Attachment
[BUFFER_FRONT_LEFT
].Renderbuffer
)) {
390 #ifdef RADEON_DEBUG_BO
391 rb
->bo
= radeon_bo_open(radeon
->radeonScreen
->bom
,
392 radeon
->radeonScreen
->frontOffset
,
395 RADEON_GEM_DOMAIN_VRAM
,
399 rb
->bo
= radeon_bo_open(radeon
->radeonScreen
->bom
,
400 radeon
->radeonScreen
->frontOffset
,
403 RADEON_GEM_DOMAIN_VRAM
,
405 #endif /* RADEON_DEBUG_BO */
407 rb
->cpp
= radeon
->radeonScreen
->cpp
;
408 rb
->pitch
= radeon
->radeonScreen
->frontPitch
* rb
->cpp
;
410 if ((rb
= (void *)draw
->base
.Attachment
[BUFFER_BACK_LEFT
].Renderbuffer
)) {
412 #ifdef RADEON_DEBUG_BO
413 rb
->bo
= radeon_bo_open(radeon
->radeonScreen
->bom
,
414 radeon
->radeonScreen
->backOffset
,
417 RADEON_GEM_DOMAIN_VRAM
,
421 rb
->bo
= radeon_bo_open(radeon
->radeonScreen
->bom
,
422 radeon
->radeonScreen
->backOffset
,
425 RADEON_GEM_DOMAIN_VRAM
,
427 #endif /* RADEON_DEBUG_BO */
429 rb
->cpp
= radeon
->radeonScreen
->cpp
;
430 rb
->pitch
= radeon
->radeonScreen
->backPitch
* rb
->cpp
;
432 if ((rb
= (void *)draw
->base
.Attachment
[BUFFER_DEPTH
].Renderbuffer
)) {
434 #ifdef RADEON_DEBUG_BO
435 rb
->bo
= radeon_bo_open(radeon
->radeonScreen
->bom
,
436 radeon
->radeonScreen
->depthOffset
,
439 RADEON_GEM_DOMAIN_VRAM
,
443 rb
->bo
= radeon_bo_open(radeon
->radeonScreen
->bom
,
444 radeon
->radeonScreen
->depthOffset
,
447 RADEON_GEM_DOMAIN_VRAM
,
449 #endif /* RADEON_DEBUG_BO */
451 rb
->cpp
= radeon
->radeonScreen
->cpp
;
452 rb
->pitch
= radeon
->radeonScreen
->depthPitch
* rb
->cpp
;
454 if ((rb
= (void *)draw
->base
.Attachment
[BUFFER_STENCIL
].Renderbuffer
)) {
456 #ifdef RADEON_DEBUG_BO
457 rb
->bo
= radeon_bo_open(radeon
->radeonScreen
->bom
,
458 radeon
->radeonScreen
->depthOffset
,
461 RADEON_GEM_DOMAIN_VRAM
,
465 rb
->bo
= radeon_bo_open(radeon
->radeonScreen
->bom
,
466 radeon
->radeonScreen
->depthOffset
,
469 RADEON_GEM_DOMAIN_VRAM
,
471 #endif /* RADEON_DEBUG_BO */
473 rb
->cpp
= radeon
->radeonScreen
->cpp
;
474 rb
->pitch
= radeon
->radeonScreen
->depthPitch
* rb
->cpp
;
479 radeon_make_renderbuffer_current(radeonContextPtr radeon
,
480 struct radeon_framebuffer
*draw
)
482 int size
= 4096*4096*4;
483 /* if radeon->fake */
484 struct radeon_renderbuffer
*rb
;
486 if (radeon
->radeonScreen
->kernel_mm
) {
487 radeon_make_kernel_renderbuffer_current(radeon
, draw
);
492 if ((rb
= (void *)draw
->base
.Attachment
[BUFFER_FRONT_LEFT
].Renderbuffer
)) {
494 #ifdef RADEON_DEBUG_BO
495 rb
->bo
= radeon_bo_open(radeon
->radeonScreen
->bom
,
496 radeon
->radeonScreen
->frontOffset
+
497 radeon
->radeonScreen
->fbLocation
,
500 RADEON_GEM_DOMAIN_VRAM
,
504 rb
->bo
= radeon_bo_open(radeon
->radeonScreen
->bom
,
505 radeon
->radeonScreen
->frontOffset
+
506 radeon
->radeonScreen
->fbLocation
,
509 RADEON_GEM_DOMAIN_VRAM
,
511 #endif /* RADEON_DEBUG_BO */
513 rb
->cpp
= radeon
->radeonScreen
->cpp
;
514 rb
->pitch
= radeon
->radeonScreen
->frontPitch
* rb
->cpp
;
516 if ((rb
= (void *)draw
->base
.Attachment
[BUFFER_BACK_LEFT
].Renderbuffer
)) {
518 #ifdef RADEON_DEBUG_BO
519 rb
->bo
= radeon_bo_open(radeon
->radeonScreen
->bom
,
520 radeon
->radeonScreen
->backOffset
+
521 radeon
->radeonScreen
->fbLocation
,
524 RADEON_GEM_DOMAIN_VRAM
,
528 rb
->bo
= radeon_bo_open(radeon
->radeonScreen
->bom
,
529 radeon
->radeonScreen
->backOffset
+
530 radeon
->radeonScreen
->fbLocation
,
533 RADEON_GEM_DOMAIN_VRAM
,
535 #endif /* RADEON_DEBUG_BO */
537 rb
->cpp
= radeon
->radeonScreen
->cpp
;
538 rb
->pitch
= radeon
->radeonScreen
->backPitch
* rb
->cpp
;
540 if ((rb
= (void *)draw
->base
.Attachment
[BUFFER_DEPTH
].Renderbuffer
)) {
542 #ifdef RADEON_DEBUG_BO
543 rb
->bo
= radeon_bo_open(radeon
->radeonScreen
->bom
,
544 radeon
->radeonScreen
->depthOffset
+
545 radeon
->radeonScreen
->fbLocation
,
548 RADEON_GEM_DOMAIN_VRAM
,
552 rb
->bo
= radeon_bo_open(radeon
->radeonScreen
->bom
,
553 radeon
->radeonScreen
->depthOffset
+
554 radeon
->radeonScreen
->fbLocation
,
557 RADEON_GEM_DOMAIN_VRAM
,
559 #endif /* RADEON_DEBUG_BO */
561 rb
->cpp
= radeon
->radeonScreen
->cpp
;
562 rb
->pitch
= radeon
->radeonScreen
->depthPitch
* rb
->cpp
;
564 if ((rb
= (void *)draw
->base
.Attachment
[BUFFER_STENCIL
].Renderbuffer
)) {
566 #ifdef RADEON_DEBUG_BO
567 rb
->bo
= radeon_bo_open(radeon
->radeonScreen
->bom
,
568 radeon
->radeonScreen
->depthOffset
+
569 radeon
->radeonScreen
->fbLocation
,
572 RADEON_GEM_DOMAIN_VRAM
,
576 rb
->bo
= radeon_bo_open(radeon
->radeonScreen
->bom
,
577 radeon
->radeonScreen
->depthOffset
+
578 radeon
->radeonScreen
->fbLocation
,
581 RADEON_GEM_DOMAIN_VRAM
,
583 #endif /* RADEON_DEBUG_BO */
585 rb
->cpp
= radeon
->radeonScreen
->cpp
;
586 rb
->pitch
= radeon
->radeonScreen
->depthPitch
* rb
->cpp
;
591 radeon_bits_per_pixel(const struct radeon_renderbuffer
*rb
)
593 switch (rb
->base
._ActualFormat
) {
595 case GL_DEPTH_COMPONENT16
:
599 case GL_DEPTH_COMPONENT24
:
600 case GL_DEPTH24_STENCIL8_EXT
:
601 case GL_STENCIL_INDEX8_EXT
:
609 radeon_update_renderbuffers(__DRIcontext
*context
, __DRIdrawable
*drawable
)
611 unsigned int attachments
[10];
612 __DRIbuffer
*buffers
= NULL
;
614 struct radeon_renderbuffer
*rb
;
616 struct radeon_framebuffer
*draw
;
617 radeonContextPtr radeon
;
619 struct radeon_bo
*depth_bo
= NULL
, *bo
;
621 if (RADEON_DEBUG
& DEBUG_DRI
)
622 fprintf(stderr
, "enter %s, drawable %p\n", __func__
, drawable
);
624 draw
= drawable
->driverPrivate
;
625 screen
= context
->driScreenPriv
;
626 radeon
= (radeonContextPtr
) context
->driverPrivate
;
628 if (screen
->dri2
.loader
629 && (screen
->dri2
.loader
->base
.version
> 2)
630 && (screen
->dri2
.loader
->getBuffersWithFormat
!= NULL
)) {
631 struct radeon_renderbuffer
*depth_rb
;
632 struct radeon_renderbuffer
*stencil_rb
;
635 if ((radeon
->is_front_buffer_rendering
||
636 radeon
->is_front_buffer_reading
||
638 && draw
->color_rb
[0]) {
639 attachments
[i
++] = __DRI_BUFFER_FRONT_LEFT
;
640 attachments
[i
++] = radeon_bits_per_pixel(draw
->color_rb
[0]);
643 if (draw
->color_rb
[1]) {
644 attachments
[i
++] = __DRI_BUFFER_BACK_LEFT
;
645 attachments
[i
++] = radeon_bits_per_pixel(draw
->color_rb
[1]);
648 depth_rb
= radeon_get_renderbuffer(&draw
->base
, BUFFER_DEPTH
);
649 stencil_rb
= radeon_get_renderbuffer(&draw
->base
, BUFFER_STENCIL
);
651 if ((depth_rb
!= NULL
) && (stencil_rb
!= NULL
)) {
652 attachments
[i
++] = __DRI_BUFFER_DEPTH_STENCIL
;
653 attachments
[i
++] = radeon_bits_per_pixel(depth_rb
);
654 } else if (depth_rb
!= NULL
) {
655 attachments
[i
++] = __DRI_BUFFER_DEPTH
;
656 attachments
[i
++] = radeon_bits_per_pixel(depth_rb
);
657 } else if (stencil_rb
!= NULL
) {
658 attachments
[i
++] = __DRI_BUFFER_STENCIL
;
659 attachments
[i
++] = radeon_bits_per_pixel(stencil_rb
);
662 buffers
= (*screen
->dri2
.loader
->getBuffersWithFormat
)(drawable
,
667 drawable
->loaderPrivate
);
668 } else if (screen
->dri2
.loader
) {
670 if (draw
->color_rb
[0])
671 attachments
[i
++] = __DRI_BUFFER_FRONT_LEFT
;
672 if (draw
->color_rb
[1])
673 attachments
[i
++] = __DRI_BUFFER_BACK_LEFT
;
674 if (radeon_get_renderbuffer(&draw
->base
, BUFFER_DEPTH
))
675 attachments
[i
++] = __DRI_BUFFER_DEPTH
;
676 if (radeon_get_renderbuffer(&draw
->base
, BUFFER_STENCIL
))
677 attachments
[i
++] = __DRI_BUFFER_STENCIL
;
679 buffers
= (*screen
->dri2
.loader
->getBuffers
)(drawable
,
684 drawable
->loaderPrivate
);
690 /* set one cliprect to cover the whole drawable */
695 drawable
->numClipRects
= 1;
696 drawable
->pClipRects
[0].x1
= 0;
697 drawable
->pClipRects
[0].y1
= 0;
698 drawable
->pClipRects
[0].x2
= drawable
->w
;
699 drawable
->pClipRects
[0].y2
= drawable
->h
;
700 drawable
->numBackClipRects
= 1;
701 drawable
->pBackClipRects
[0].x1
= 0;
702 drawable
->pBackClipRects
[0].y1
= 0;
703 drawable
->pBackClipRects
[0].x2
= drawable
->w
;
704 drawable
->pBackClipRects
[0].y2
= drawable
->h
;
705 for (i
= 0; i
< count
; i
++) {
706 switch (buffers
[i
].attachment
) {
707 case __DRI_BUFFER_FRONT_LEFT
:
708 rb
= draw
->color_rb
[0];
709 regname
= "dri2 front buffer";
711 case __DRI_BUFFER_FAKE_FRONT_LEFT
:
712 rb
= draw
->color_rb
[0];
713 regname
= "dri2 fake front buffer";
715 case __DRI_BUFFER_BACK_LEFT
:
716 rb
= draw
->color_rb
[1];
717 regname
= "dri2 back buffer";
719 case __DRI_BUFFER_DEPTH
:
720 rb
= radeon_get_renderbuffer(&draw
->base
, BUFFER_DEPTH
);
721 regname
= "dri2 depth buffer";
723 case __DRI_BUFFER_DEPTH_STENCIL
:
724 rb
= radeon_get_renderbuffer(&draw
->base
, BUFFER_DEPTH
);
725 regname
= "dri2 depth / stencil buffer";
727 case __DRI_BUFFER_STENCIL
:
728 rb
= radeon_get_renderbuffer(&draw
->base
, BUFFER_STENCIL
);
729 regname
= "dri2 stencil buffer";
731 case __DRI_BUFFER_ACCUM
:
734 "unhandled buffer attach event, attacment type %d\n",
735 buffers
[i
].attachment
);
743 uint32_t name
= radeon_gem_name_bo(rb
->bo
);
744 if (name
== buffers
[i
].name
)
748 if (RADEON_DEBUG
& DEBUG_DRI
)
750 "attaching buffer %s, %d, at %d, cpp %d, pitch %d\n",
751 regname
, buffers
[i
].name
, buffers
[i
].attachment
,
752 buffers
[i
].cpp
, buffers
[i
].pitch
);
754 rb
->cpp
= buffers
[i
].cpp
;
755 rb
->pitch
= buffers
[i
].pitch
;
756 rb
->base
.Width
= drawable
->w
;
757 rb
->base
.Height
= drawable
->h
;
760 if (buffers
[i
].attachment
== __DRI_BUFFER_STENCIL
&& depth_bo
) {
761 if (RADEON_DEBUG
& DEBUG_DRI
)
762 fprintf(stderr
, "(reusing depth buffer as stencil)\n");
766 uint32_t tiling_flags
= 0, pitch
= 0;
768 #ifdef RADEON_DEBUG_BO
769 bo
= radeon_bo_open(radeon
->radeonScreen
->bom
,
773 RADEON_GEM_DOMAIN_VRAM
,
777 bo
= radeon_bo_open(radeon
->radeonScreen
->bom
,
781 RADEON_GEM_DOMAIN_VRAM
,
783 #endif /* RADEON_DEBUG_BO */
786 fprintf(stderr
, "failed to attach %s %d\n",
787 regname
, buffers
[i
].name
);
791 ret
= radeon_bo_get_tiling(bo
, &tiling_flags
, &pitch
);
792 if (tiling_flags
& RADEON_TILING_MACRO
)
793 bo
->flags
|= RADEON_BO_FLAGS_MACRO_TILE
;
794 if (tiling_flags
& RADEON_TILING_MICRO
)
795 bo
->flags
|= RADEON_BO_FLAGS_MICRO_TILE
;
799 if (buffers
[i
].attachment
== __DRI_BUFFER_DEPTH
) {
800 if (draw
->base
.Visual
.depthBits
== 16)
805 radeon_renderbuffer_set_bo(rb
, bo
);
808 if (buffers
[i
].attachment
== __DRI_BUFFER_DEPTH_STENCIL
) {
809 rb
= radeon_get_renderbuffer(&draw
->base
, BUFFER_STENCIL
);
811 struct radeon_bo
*stencil_bo
= NULL
;
814 uint32_t name
= radeon_gem_name_bo(rb
->bo
);
815 if (name
== buffers
[i
].name
)
820 radeon_bo_ref(stencil_bo
);
821 radeon_renderbuffer_set_bo(rb
, stencil_bo
);
822 radeon_bo_unref(stencil_bo
);
827 driUpdateFramebufferSize(radeon
->glCtx
, drawable
);
830 /* Force the context `c' to be the current context and associate with it
833 GLboolean
radeonMakeCurrent(__DRIcontextPrivate
* driContextPriv
,
834 __DRIdrawablePrivate
* driDrawPriv
,
835 __DRIdrawablePrivate
* driReadPriv
)
837 radeonContextPtr radeon
;
838 struct radeon_framebuffer
*drfb
;
839 struct gl_framebuffer
*readfb
;
841 if (!driContextPriv
) {
842 if (RADEON_DEBUG
& DEBUG_DRI
)
843 fprintf(stderr
, "%s ctx is null\n", __FUNCTION__
);
844 _mesa_make_current(NULL
, NULL
, NULL
);
848 radeon
= (radeonContextPtr
) driContextPriv
->driverPrivate
;
849 drfb
= driDrawPriv
->driverPrivate
;
850 readfb
= driReadPriv
->driverPrivate
;
852 if (driContextPriv
->driScreenPriv
->dri2
.enabled
) {
853 radeon_update_renderbuffers(driContextPriv
, driDrawPriv
);
854 if (driDrawPriv
!= driReadPriv
)
855 radeon_update_renderbuffers(driContextPriv
, driReadPriv
);
856 _mesa_reference_renderbuffer(&radeon
->state
.color
.rb
,
857 &(radeon_get_renderbuffer(&drfb
->base
, BUFFER_BACK_LEFT
)->base
));
858 _mesa_reference_renderbuffer(&radeon
->state
.depth
.rb
,
859 &(radeon_get_renderbuffer(&drfb
->base
, BUFFER_DEPTH
)->base
));
861 radeon_make_renderbuffer_current(radeon
, drfb
);
864 if (RADEON_DEBUG
& DEBUG_DRI
)
865 fprintf(stderr
, "%s ctx %p dfb %p rfb %p\n", __FUNCTION__
, radeon
->glCtx
, drfb
, readfb
);
867 driUpdateFramebufferSize(radeon
->glCtx
, driDrawPriv
);
868 if (driReadPriv
!= driDrawPriv
)
869 driUpdateFramebufferSize(radeon
->glCtx
, driReadPriv
);
871 _mesa_make_current(radeon
->glCtx
, &drfb
->base
, readfb
);
873 _mesa_update_state(radeon
->glCtx
);
875 if (radeon
->glCtx
->DrawBuffer
== &drfb
->base
) {
876 if (driDrawPriv
->swap_interval
== (unsigned)-1) {
878 driDrawPriv
->vblFlags
=
879 (radeon
->radeonScreen
->irq
!= 0)
880 ? driGetDefaultVBlankFlags(&radeon
->
882 : VBLANK_FLAG_NO_IRQ
;
884 driDrawableInitVBlank(driDrawPriv
);
885 drfb
->vbl_waited
= driDrawPriv
->vblSeq
;
887 for (i
= 0; i
< 2; i
++) {
888 if (drfb
->color_rb
[i
])
889 drfb
->color_rb
[i
]->vbl_pending
= driDrawPriv
->vblSeq
;
894 radeon_window_moved(radeon
);
895 radeon_draw_buffer(radeon
->glCtx
, &drfb
->base
);
899 if (RADEON_DEBUG
& DEBUG_DRI
)
900 fprintf(stderr
, "End %s\n", __FUNCTION__
);