radeon: Drop the DRI1 swapbuffers implementation.
This commit is contained in:
@@ -258,25 +258,6 @@ void radeonScissor(struct gl_context* ctx, GLint x, GLint y, GLsizei w, GLsizei
|
||||
* SwapBuffers with client-side throttling
|
||||
*/
|
||||
|
||||
static uint32_t radeonGetLastFrame(radeonContextPtr radeon)
|
||||
{
|
||||
drm_radeon_getparam_t gp;
|
||||
int ret;
|
||||
uint32_t frame = 0;
|
||||
|
||||
gp.param = RADEON_PARAM_LAST_FRAME;
|
||||
gp.value = (int *)&frame;
|
||||
ret = drmCommandWriteRead(radeon->dri.fd, DRM_RADEON_GETPARAM,
|
||||
&gp, sizeof(gp));
|
||||
if (ret) {
|
||||
fprintf(stderr, "%s: drmRadeonGetParam: %d\n", __FUNCTION__,
|
||||
ret);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
return frame;
|
||||
}
|
||||
|
||||
uint32_t radeonGetAge(radeonContextPtr radeon)
|
||||
{
|
||||
drm_radeon_getparam_t gp;
|
||||
@@ -296,67 +277,6 @@ uint32_t radeonGetAge(radeonContextPtr radeon)
|
||||
return age;
|
||||
}
|
||||
|
||||
static void radeonEmitIrqLocked(radeonContextPtr radeon)
|
||||
{
|
||||
drm_radeon_irq_emit_t ie;
|
||||
int ret;
|
||||
|
||||
ie.irq_seq = &radeon->iw.irq_seq;
|
||||
ret = drmCommandWriteRead(radeon->dri.fd, DRM_RADEON_IRQ_EMIT,
|
||||
&ie, sizeof(ie));
|
||||
if (ret) {
|
||||
fprintf(stderr, "%s: drmRadeonIrqEmit: %d\n", __FUNCTION__,
|
||||
ret);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
static void radeonWaitIrq(radeonContextPtr radeon)
|
||||
{
|
||||
int ret;
|
||||
|
||||
do {
|
||||
ret = drmCommandWrite(radeon->dri.fd, DRM_RADEON_IRQ_WAIT,
|
||||
&radeon->iw, sizeof(radeon->iw));
|
||||
} while (ret && (errno == EINTR || errno == EBUSY));
|
||||
|
||||
if (ret) {
|
||||
fprintf(stderr, "%s: drmRadeonIrqWait: %d\n", __FUNCTION__,
|
||||
ret);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
static void radeonWaitForFrameCompletion(radeonContextPtr radeon)
|
||||
{
|
||||
drm_radeon_sarea_t *sarea = radeon->sarea;
|
||||
|
||||
if (radeon->do_irqs) {
|
||||
if (radeonGetLastFrame(radeon) < sarea->last_frame) {
|
||||
if (!radeon->irqsEmitted) {
|
||||
while (radeonGetLastFrame(radeon) <
|
||||
sarea->last_frame) ;
|
||||
} else {
|
||||
UNLOCK_HARDWARE(radeon);
|
||||
radeonWaitIrq(radeon);
|
||||
LOCK_HARDWARE(radeon);
|
||||
}
|
||||
radeon->irqsEmitted = 10;
|
||||
}
|
||||
|
||||
if (radeon->irqsEmitted) {
|
||||
radeonEmitIrqLocked(radeon);
|
||||
radeon->irqsEmitted--;
|
||||
}
|
||||
} else {
|
||||
while (radeonGetLastFrame(radeon) < sarea->last_frame) {
|
||||
UNLOCK_HARDWARE(radeon);
|
||||
if (radeon->do_usleeps)
|
||||
DO_USLEEP(1);
|
||||
LOCK_HARDWARE(radeon);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* wait for idle */
|
||||
void radeonWaitForIdleLocked(radeonContextPtr radeon)
|
||||
@@ -409,213 +329,6 @@ static void radeon_flip_renderbuffers(struct radeon_framebuffer *rfb)
|
||||
}
|
||||
}
|
||||
|
||||
/* Copy the back color buffer to the front color buffer.
|
||||
*/
|
||||
void radeonCopyBuffer( __DRIdrawable *dPriv,
|
||||
const drm_clip_rect_t *rect)
|
||||
{
|
||||
radeonContextPtr rmesa;
|
||||
GLint nbox, i, ret;
|
||||
|
||||
assert(dPriv);
|
||||
assert(dPriv->driContextPriv);
|
||||
assert(dPriv->driContextPriv->driverPrivate);
|
||||
|
||||
rmesa = (radeonContextPtr) dPriv->driContextPriv->driverPrivate;
|
||||
|
||||
LOCK_HARDWARE(rmesa);
|
||||
|
||||
if ( RADEON_DEBUG & RADEON_IOCTL ) {
|
||||
fprintf( stderr, "\n%s( %p )\n\n", __FUNCTION__, (void *) rmesa->glCtx );
|
||||
}
|
||||
|
||||
nbox = dPriv->numClipRects; /* must be in locked region */
|
||||
|
||||
for ( i = 0 ; i < nbox ; ) {
|
||||
GLint nr = MIN2( i + RADEON_NR_SAREA_CLIPRECTS , nbox );
|
||||
drm_clip_rect_t *box = dPriv->pClipRects;
|
||||
drm_clip_rect_t *b = rmesa->sarea->boxes;
|
||||
GLint n = 0;
|
||||
|
||||
for ( ; i < nr ; i++ ) {
|
||||
|
||||
*b = box[i];
|
||||
|
||||
if (rect)
|
||||
{
|
||||
if (rect->x1 > b->x1)
|
||||
b->x1 = rect->x1;
|
||||
if (rect->y1 > b->y1)
|
||||
b->y1 = rect->y1;
|
||||
if (rect->x2 < b->x2)
|
||||
b->x2 = rect->x2;
|
||||
if (rect->y2 < b->y2)
|
||||
b->y2 = rect->y2;
|
||||
|
||||
if (b->x1 >= b->x2 || b->y1 >= b->y2)
|
||||
continue;
|
||||
}
|
||||
|
||||
b++;
|
||||
n++;
|
||||
}
|
||||
rmesa->sarea->nbox = n;
|
||||
|
||||
if (!n)
|
||||
continue;
|
||||
|
||||
ret = drmCommandNone( rmesa->dri.fd, DRM_RADEON_SWAP );
|
||||
|
||||
if ( ret ) {
|
||||
fprintf( stderr, "DRM_RADEON_SWAP_BUFFERS: return = %d\n", ret );
|
||||
UNLOCK_HARDWARE( rmesa );
|
||||
exit( 1 );
|
||||
}
|
||||
}
|
||||
|
||||
UNLOCK_HARDWARE( rmesa );
|
||||
}
|
||||
|
||||
static int radeonScheduleSwap(__DRIdrawable *dPriv, GLboolean *missed_target)
|
||||
{
|
||||
radeonContextPtr rmesa;
|
||||
|
||||
rmesa = (radeonContextPtr) dPriv->driContextPriv->driverPrivate;
|
||||
radeon_firevertices(rmesa);
|
||||
|
||||
LOCK_HARDWARE( rmesa );
|
||||
|
||||
if (!dPriv->numClipRects) {
|
||||
UNLOCK_HARDWARE(rmesa);
|
||||
usleep(10000); /* throttle invisible client 10ms */
|
||||
return 0;
|
||||
}
|
||||
|
||||
radeonWaitForFrameCompletion(rmesa);
|
||||
|
||||
UNLOCK_HARDWARE(rmesa);
|
||||
driWaitForVBlank(dPriv, missed_target);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static GLboolean radeonPageFlip( __DRIdrawable *dPriv )
|
||||
{
|
||||
radeonContextPtr radeon;
|
||||
GLint ret;
|
||||
struct radeon_framebuffer *rfb;
|
||||
|
||||
assert(dPriv);
|
||||
assert(dPriv->driContextPriv);
|
||||
assert(dPriv->driContextPriv->driverPrivate);
|
||||
|
||||
radeon = (radeonContextPtr) dPriv->driContextPriv->driverPrivate;
|
||||
rfb = dPriv->driverPrivate;
|
||||
|
||||
LOCK_HARDWARE(radeon);
|
||||
|
||||
if ( RADEON_DEBUG & RADEON_IOCTL ) {
|
||||
fprintf(stderr, "%s: pfCurrentPage: %d %d\n", __FUNCTION__,
|
||||
radeon->sarea->pfCurrentPage, radeon->sarea->pfState);
|
||||
}
|
||||
drm_clip_rect_t *box = dPriv->pClipRects;
|
||||
drm_clip_rect_t *b = radeon->sarea->boxes;
|
||||
b[0] = box[0];
|
||||
radeon->sarea->nbox = 1;
|
||||
|
||||
ret = drmCommandNone( radeon->dri.fd, DRM_RADEON_FLIP );
|
||||
|
||||
UNLOCK_HARDWARE(radeon);
|
||||
|
||||
if ( ret ) {
|
||||
fprintf( stderr, "DRM_RADEON_FLIP: return = %d\n", ret );
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
if (!rfb->pf_active)
|
||||
return GL_FALSE;
|
||||
|
||||
rfb->pf_current_page = radeon->sarea->pfCurrentPage;
|
||||
radeon_flip_renderbuffers(rfb);
|
||||
radeon_draw_buffer(radeon->glCtx, &rfb->base);
|
||||
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Swap front and back buffer.
|
||||
*/
|
||||
void radeonSwapBuffers(__DRIdrawable * dPriv)
|
||||
{
|
||||
int64_t ust;
|
||||
__DRIscreen *psp;
|
||||
|
||||
if (dPriv->driContextPriv && dPriv->driContextPriv->driverPrivate) {
|
||||
radeonContextPtr radeon;
|
||||
struct gl_context *ctx;
|
||||
|
||||
radeon = (radeonContextPtr) dPriv->driContextPriv->driverPrivate;
|
||||
ctx = radeon->glCtx;
|
||||
|
||||
if (ctx->Visual.doubleBufferMode) {
|
||||
GLboolean missed_target;
|
||||
struct radeon_framebuffer *rfb = dPriv->driverPrivate;
|
||||
_mesa_notifySwapBuffers(ctx);/* flush pending rendering comands */
|
||||
|
||||
radeonScheduleSwap(dPriv, &missed_target);
|
||||
|
||||
if (rfb->pf_active) {
|
||||
radeonPageFlip(dPriv);
|
||||
} else {
|
||||
radeonCopyBuffer(dPriv, NULL);
|
||||
}
|
||||
|
||||
psp = dPriv->driScreenPriv;
|
||||
|
||||
rfb->swap_count++;
|
||||
(*psp->systemTime->getUST)( & ust );
|
||||
if ( missed_target ) {
|
||||
rfb->swap_missed_count++;
|
||||
rfb->swap_missed_ust = ust - rfb->swap_ust;
|
||||
}
|
||||
|
||||
rfb->swap_ust = ust;
|
||||
radeon->hw.all_dirty = GL_TRUE;
|
||||
}
|
||||
} else {
|
||||
/* XXX this shouldn't be an error but we can't handle it for now */
|
||||
_mesa_problem(NULL, "%s: drawable has no context!",
|
||||
__FUNCTION__);
|
||||
}
|
||||
}
|
||||
|
||||
void radeonCopySubBuffer(__DRIdrawable * dPriv,
|
||||
int x, int y, int w, int h )
|
||||
{
|
||||
if (dPriv->driContextPriv && dPriv->driContextPriv->driverPrivate) {
|
||||
radeonContextPtr radeon;
|
||||
struct gl_context *ctx;
|
||||
|
||||
radeon = (radeonContextPtr) dPriv->driContextPriv->driverPrivate;
|
||||
ctx = radeon->glCtx;
|
||||
|
||||
if (ctx->Visual.doubleBufferMode) {
|
||||
drm_clip_rect_t rect;
|
||||
rect.x1 = x + dPriv->x;
|
||||
rect.y1 = (dPriv->h - y - h) + dPriv->y;
|
||||
rect.x2 = rect.x1 + w;
|
||||
rect.y2 = rect.y1 + h;
|
||||
_mesa_notifySwapBuffers(ctx); /* flush pending rendering comands */
|
||||
radeonCopyBuffer(dPriv, &rect);
|
||||
}
|
||||
} else {
|
||||
/* XXX this shouldn't be an error but we can't handle it for now */
|
||||
_mesa_problem(NULL, "%s: drawable has no context!",
|
||||
__FUNCTION__);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if we're about to draw into the front color buffer.
|
||||
* If so, set the intel->front_buffer_dirty field to true.
|
||||
|
||||
@@ -13,11 +13,6 @@ void radeonScissor(struct gl_context* ctx, GLint x, GLint y, GLsizei w, GLsizei
|
||||
|
||||
void radeonWaitForIdleLocked(radeonContextPtr radeon);
|
||||
extern uint32_t radeonGetAge(radeonContextPtr radeon);
|
||||
void radeonCopyBuffer( __DRIdrawable *dPriv,
|
||||
const drm_clip_rect_t *rect);
|
||||
void radeonSwapBuffers(__DRIdrawable * dPriv);
|
||||
void radeonCopySubBuffer(__DRIdrawable * dPriv,
|
||||
int x, int y, int w, int h );
|
||||
|
||||
void radeonUpdatePageFlipping(radeonContextPtr rmesa);
|
||||
|
||||
|
||||
@@ -1585,7 +1585,6 @@ const struct __DriverAPIRec driDriverAPI = {
|
||||
#endif
|
||||
.CreateBuffer = radeonCreateBuffer,
|
||||
.DestroyBuffer = radeonDestroyBuffer,
|
||||
.SwapBuffers = radeonSwapBuffers,
|
||||
.MakeCurrent = radeonMakeCurrent,
|
||||
.UnbindContext = radeonUnbindContext,
|
||||
.GetSwapInfo = getSwapInfo,
|
||||
@@ -1593,7 +1592,6 @@ const struct __DriverAPIRec driDriverAPI = {
|
||||
.WaitForMSC = driWaitForMSC32,
|
||||
.WaitForSBC = NULL,
|
||||
.SwapBuffersMSC = NULL,
|
||||
.CopySubBuffer = radeonCopySubBuffer,
|
||||
/* DRI2 */
|
||||
.InitScreen2 = radeonInitScreen2,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user