#include <sched.h>
#include <errno.h>
-#include "glheader.h"
-#include "imports.h"
-#include "macros.h"
-#include "context.h"
+#include "main/glheader.h"
+#include "main/imports.h"
+#include "main/macros.h"
+#include "main/context.h"
#include "swrast/swrast.h"
-#include "r200_context.h"
#include "r300_context.h"
-#include "r200_state.h"
#include "radeon_ioctl.h"
-#include "r200_ioctl.h"
#include "r300_ioctl.h"
-#include "r200_tcl.h"
-#include "r200_sanity.h"
#include "r300_state.h"
#include "radeon_reg.h"
+#include "drirenderbuffer.h"
#include "vblank.h"
static void radeonWaitForIdle(radeonContextPtr radeon);
return frame;
}
+uint32_t radeonGetAge(radeonContextPtr radeon)
+{
+ drm_radeon_getparam_t gp;
+ int ret;
+ uint32_t age;
+
+ gp.param = RADEON_PARAM_LAST_CLEAR;
+ gp.value = (int *)&age;
+ ret = drmCommandWriteRead(radeon->dri.fd, DRM_RADEON_GETPARAM,
+ &gp, sizeof(gp));
+ if (ret) {
+ fprintf(stderr, "%s: drmRadeonGetParam: %d\n", __FUNCTION__,
+ ret);
+ exit(1);
+ }
+
+ return age;
+}
+
static void radeonEmitIrqLocked(radeonContextPtr radeon)
{
drm_radeon_irq_emit_t ie;
do {
ret = drmCommandWrite(radeon->dri.fd, DRM_RADEON_IRQ_WAIT,
&radeon->iw, sizeof(radeon->iw));
- } while (ret && (errno == EINTR || errno == EAGAIN));
+ } while (ret && (errno == EINTR || errno == EBUSY));
if (ret) {
fprintf(stderr, "%s: drmRadeonIrqWait: %d\n", __FUNCTION__,
/* Copy the back color buffer to the front color buffer.
*/
-void radeonCopyBuffer(const __DRIdrawablePrivate * dPriv)
+void radeonCopyBuffer(__DRIdrawablePrivate * dPriv,
+ const drm_clip_rect_t * rect)
{
radeonContextPtr radeon;
GLint nbox, i, ret;
GLboolean missed_target;
int64_t ust;
+ __DRIscreenPrivate *psp = dPriv->driScreenPriv;
assert(dPriv);
assert(dPriv->driContextPriv);
(void *)radeon->glCtx);
}
- if (IS_FAMILY_R200(radeon))
- R200_FIREVERTICES((r200ContextPtr)radeon);
- else
- r300Flush(radeon->glCtx);
+ r300Flush(radeon->glCtx);
LOCK_HARDWARE(radeon);
* request at a time.
*/
radeonWaitForFrameCompletion(radeon);
- UNLOCK_HARDWARE(radeon);
- driWaitForVBlank(dPriv, &radeon->vbl_seq, radeon->vblank_flags,
- &missed_target);
- LOCK_HARDWARE(radeon);
+ if (!rect)
+ {
+ UNLOCK_HARDWARE(radeon);
+ driWaitForVBlank(dPriv, &missed_target);
+ LOCK_HARDWARE(radeon);
+ }
nbox = dPriv->numClipRects; /* must be in locked region */
drm_clip_rect_t *b = radeon->sarea->boxes;
GLint n = 0;
- for (; i < nr; i++) {
- *b++ = box[i];
- n++;
+ 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++;
}
radeon->sarea->nbox = n;
+ if (!n)
+ continue;
+
ret = drmCommandNone(radeon->dri.fd, DRM_RADEON_SWAP);
if (ret) {
}
UNLOCK_HARDWARE(radeon);
+ if (!rect)
+ {
+ ((r300ContextPtr)radeon)->hw.all_dirty = GL_TRUE;
- if (IS_FAMILY_R200(radeon))
- ((r200ContextPtr)radeon)->hw.all_dirty = GL_TRUE;
- else
- ((r300ContextPtr)radeon)->hw.all_dirty = GL_TRUE;
-
- radeon->swap_count++;
- (*dri_interface->getUST) (&ust);
- if (missed_target) {
+ radeon->swap_count++;
+ (*psp->systemTime->getUST) (&ust);
+ if (missed_target) {
radeon->swap_missed_count++;
radeon->swap_missed_ust = ust - radeon->swap_ust;
- }
+ }
- radeon->swap_ust = ust;
+ radeon->swap_ust = ust;
- sched_yield();
+ sched_yield();
+ }
}
-void radeonPageFlip(const __DRIdrawablePrivate * dPriv)
+void radeonPageFlip(__DRIdrawablePrivate * dPriv)
{
radeonContextPtr radeon;
GLint ret;
GLboolean missed_target;
+ __DRIscreenPrivate *psp = dPriv->driScreenPriv;
assert(dPriv);
assert(dPriv->driContextPriv);
radeon->sarea->pfCurrentPage);
}
- if (IS_FAMILY_R200(radeon))
- R200_FIREVERTICES((r200ContextPtr)radeon);
- else
- r300Flush(radeon->glCtx);
+ r300Flush(radeon->glCtx);
LOCK_HARDWARE(radeon);
if (!dPriv->numClipRects) {
*/
radeonWaitForFrameCompletion(radeon);
UNLOCK_HARDWARE(radeon);
- driWaitForVBlank(dPriv, &radeon->vbl_seq, radeon->vblank_flags,
- &missed_target);
+ driWaitForVBlank(dPriv, &missed_target);
if (missed_target) {
radeon->swap_missed_count++;
- (void)(*dri_interface->getUST) (&radeon->swap_missed_ust);
+ (void)(*psp->systemTime->getUST) (&radeon->swap_missed_ust);
}
LOCK_HARDWARE(radeon);
}
radeon->swap_count++;
- (void)(*dri_interface->getUST) (&radeon->swap_ust);
+ (void)(*psp->systemTime->getUST) (&radeon->swap_ust);
+
+ driFlipRenderbuffers(radeon->glCtx->WinSysDrawBuffer,
+ radeon->sarea->pfCurrentPage);
if (radeon->sarea->pfCurrentPage == 1) {
radeon->state.color.drawOffset = radeon->radeonScreen->frontOffset;
radeon->state.color.drawPitch = radeon->radeonScreen->backPitch;
}
- if (IS_FAMILY_R200(radeon)) {
- r200ContextPtr r200 = (r200ContextPtr)radeon;
-
- R200_STATECHANGE(r200, ctx);
- r200->hw.ctx.cmd[CTX_RB3D_COLOROFFSET] = radeon->state.color.drawOffset
- + radeon->radeonScreen->fbLocation;
- r200->hw.ctx.cmd[CTX_RB3D_COLORPITCH] = radeon->state.color.drawPitch;
- }
- if (IS_FAMILY_R300(radeon)) {
+ if (IS_R300_CLASS(radeon->radeonScreen)) {
r300ContextPtr r300 = (r300ContextPtr)radeon;
R300_STATECHANGE(r300, cb);
r300->hw.cb.cmd[R300_CB_OFFSET] = r300->radeon.state.color.drawOffset +
if (ret < 0) {
UNLOCK_HARDWARE(radeon);
- fprintf(stderr, "Error: R200 timed out... exiting\n");
+ fprintf(stderr, "Error: R300 timed out... exiting\n");
exit(-1);
}
}
{
radeonContextPtr radeon = RADEON_CONTEXT(ctx);
- if (IS_FAMILY_R300(radeon))
+ if (IS_R300_CLASS(radeon->radeonScreen))
r300Flush(ctx);
-#if R200_MERGED
- else
- r200Flush(ctx);
-#endif
}