some fixes, fake frontbuffer
still doesn't work quite right (resize). Fake frontbuffer doesn't copy in real frontbuffer. Don't even think about doing rotation/page flip/triple buffering for now... More cleanups needed (fake cliprects etc.)
This commit is contained in:
@@ -463,6 +463,7 @@ i915_state_draw_region(struct intel_context *intel,
|
||||
* Set stride/cpp values
|
||||
*/
|
||||
if (color_region) {
|
||||
// fprintf(stderr, "color pitch %d\n", color_region->pitch);
|
||||
state->Buffer[I915_DESTREG_CBUFADDR0] = _3DSTATE_BUF_INFO_CMD;
|
||||
state->Buffer[I915_DESTREG_CBUFADDR1] =
|
||||
(BUF_3D_ID_COLOR_BACK |
|
||||
@@ -471,6 +472,7 @@ i915_state_draw_region(struct intel_context *intel,
|
||||
}
|
||||
|
||||
if (depth_region) {
|
||||
// fprintf(stderr, "depth pitch %d\n", depth_region->pitch);
|
||||
state->Buffer[I915_DESTREG_DBUFADDR0] = _3DSTATE_BUF_INFO_CMD;
|
||||
state->Buffer[I915_DESTREG_DBUFADDR1] =
|
||||
(BUF_3D_ID_DEPTH |
|
||||
|
||||
@@ -82,9 +82,11 @@ intelCopyBuffer(const __DRIdrawablePrivate * dPriv,
|
||||
if (dPriv && dPriv->numClipRects) {
|
||||
struct intel_framebuffer *intel_fb = dPriv->driverPrivate;
|
||||
const struct intel_region *frontRegion
|
||||
= intel_get_rb_region(&intel_fb->Base, BUFFER_FRONT_LEFT);
|
||||
= intelScreen->front_region;
|
||||
const struct intel_region *backRegion
|
||||
= intel_get_rb_region(&intel_fb->Base, BUFFER_BACK_LEFT);
|
||||
= intel->ctx.DrawBuffer->_ColorDrawBufferMask[0] == BUFFER_BIT_FRONT_LEFT ?
|
||||
intel_get_rb_region(&intel_fb->Base, BUFFER_FRONT_LEFT) :
|
||||
intel_get_rb_region(&intel_fb->Base, BUFFER_BACK_LEFT);
|
||||
const int nbox = dPriv->numClipRects;
|
||||
const drm_clip_rect_t *pbox = dPriv->pClipRects;
|
||||
const int pitch = frontRegion->pitch;
|
||||
@@ -100,7 +102,7 @@ intelCopyBuffer(const __DRIdrawablePrivate * dPriv,
|
||||
// ASSERT(frontRegion->pitch == backRegion->pitch);
|
||||
ASSERT(frontRegion->cpp == backRegion->cpp);
|
||||
|
||||
DBG("copy buffer, front pitch %d back pitch %d\n",
|
||||
DBG("front pitch %d back pitch %d\n",
|
||||
frontRegion->pitch, backRegion->pitch);
|
||||
|
||||
if (cpp == 2) {
|
||||
@@ -138,6 +140,11 @@ intelCopyBuffer(const __DRIdrawablePrivate * dPriv,
|
||||
continue;
|
||||
}
|
||||
|
||||
DBG("box x1 x2 y1 y2 %d %d %d %d\n",
|
||||
box.x1, box.x2, box.y1, box.y2);
|
||||
|
||||
/* XXX should make sure only the minimum area based on
|
||||
old draw buffer and new front clip rects is copied */
|
||||
sbox.x1 = box.x1 - dPriv->x;
|
||||
sbox.y1 = box.y1 - dPriv->y;
|
||||
|
||||
@@ -417,9 +424,8 @@ intelClearWithBlit(GLcontext * ctx, GLbitfield mask)
|
||||
b = *box;
|
||||
}
|
||||
|
||||
if (0)
|
||||
_mesa_printf("clear %d,%d..%d,%d, mask %x\n",
|
||||
b.x1, b.y1, b.x2, b.y2, mask);
|
||||
DBG("clear %d,%d..%d,%d, mask %x\n",
|
||||
b.x1, b.y1, b.x2, b.y2, mask);
|
||||
|
||||
/* Loop over all renderbuffers */
|
||||
for (buf = 0; buf < BUFFER_COUNT && clearMask; buf++) {
|
||||
|
||||
@@ -930,7 +930,7 @@ intelSwapBuffers(__DRIdrawablePrivate * dPriv)
|
||||
GLboolean missed_target;
|
||||
struct intel_framebuffer *intel_fb = dPriv->driverPrivate;
|
||||
int64_t ust;
|
||||
|
||||
|
||||
_mesa_notifySwapBuffers(ctx); /* flush pending rendering comands */
|
||||
|
||||
if (screen->current_rotation != 0 ||
|
||||
@@ -956,6 +956,16 @@ intelSwapBuffers(__DRIdrawablePrivate * dPriv)
|
||||
|
||||
intel_fb->swap_ust = ust;
|
||||
}
|
||||
if (dPriv && intel->lastStamp != dPriv->lastStamp) {
|
||||
/* XXX this doesn't appear to work quite right.
|
||||
And in any case, it will never get called with single buffered
|
||||
rendering here...
|
||||
And if it's only a window move (not resize), don't need to do anything. */
|
||||
if (INTEL_DEBUG & DEBUG_LOCK)
|
||||
_mesa_printf("doing defered drawable update\n");
|
||||
intelWindowMoved(intel);
|
||||
intel->lastStamp = dPriv->lastStamp;
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* XXX this shouldn't be an error but we can't handle it for now */
|
||||
@@ -1068,21 +1078,12 @@ intel_draw_buffer(GLcontext * ctx, struct gl_framebuffer *fb)
|
||||
* And set up cliprects.
|
||||
*/
|
||||
if (fb->Name == 0) {
|
||||
intelSetPrivbufClipRects(intel);
|
||||
/* drawing to window system buffer */
|
||||
if (front) {
|
||||
#if 0
|
||||
intelSetFrontClipRects(intel);
|
||||
#else
|
||||
intelSetPrivbufClipRects(intel);
|
||||
#endif
|
||||
colorRegion = intel_get_rb_region(fb, BUFFER_FRONT_LEFT);
|
||||
}
|
||||
else {
|
||||
#if 0
|
||||
intelSetBackClipRects(intel);
|
||||
#else
|
||||
intelSetPrivbufClipRects(intel);
|
||||
#endif
|
||||
colorRegion = intel_get_rb_region(fb, BUFFER_BACK_LEFT);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -282,18 +282,22 @@ intelFlush(GLcontext * ctx)
|
||||
* Check if we need to rotate/warp the front color buffer to the
|
||||
* rotated screen. We generally need to do this when we get a glFlush
|
||||
* or glFinish after drawing to the front color buffer.
|
||||
* If no rotation, just copy the private fake front buffer to the real one.
|
||||
*/
|
||||
static void
|
||||
intelCheckFrontRotate(GLcontext * ctx)
|
||||
intelCheckFrontUpdate(GLcontext * ctx)
|
||||
{
|
||||
struct intel_context *intel = intel_context(ctx);
|
||||
if (intel->ctx.DrawBuffer->_ColorDrawBufferMask[0] ==
|
||||
BUFFER_BIT_FRONT_LEFT) {
|
||||
intelScreenPrivate *screen = intel->intelScreen;
|
||||
__DRIdrawablePrivate *dPriv = intel->driDrawable;
|
||||
if (screen->current_rotation != 0) {
|
||||
__DRIdrawablePrivate *dPriv = intel->driDrawable;
|
||||
intelRotateWindow(intel, dPriv, BUFFER_BIT_FRONT_LEFT);
|
||||
}
|
||||
else {
|
||||
intelCopyBuffer(dPriv, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -305,7 +309,7 @@ static void
|
||||
intelglFlush(GLcontext * ctx)
|
||||
{
|
||||
intelFlush(ctx);
|
||||
intelCheckFrontRotate(ctx);
|
||||
intelCheckFrontUpdate(ctx);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -319,7 +323,7 @@ intelFinish(GLcontext * ctx)
|
||||
driFenceUnReference(intel->batch->last_fence);
|
||||
intel->batch->last_fence = NULL;
|
||||
}
|
||||
intelCheckFrontRotate(ctx);
|
||||
intelCheckFrontUpdate(ctx);
|
||||
}
|
||||
|
||||
|
||||
@@ -724,8 +728,10 @@ intelContendedLock(struct intel_context *intel, GLuint flags)
|
||||
/* Drawable changed?
|
||||
*/
|
||||
if (dPriv && intel->lastStamp != dPriv->lastStamp) {
|
||||
intelWindowMoved(intel);
|
||||
intel->lastStamp = dPriv->lastStamp;
|
||||
if (INTEL_DEBUG & DEBUG_LOCK)
|
||||
_mesa_printf("drawable change detected but defering update\n");
|
||||
/* intelWindowMoved(intel);
|
||||
intel->lastStamp = dPriv->lastStamp;*/
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -172,6 +172,7 @@ intel_recreate_static(intelScreenPrivate *intelScreen,
|
||||
static void
|
||||
intel_recreate_static_regions(intelScreenPrivate *intelScreen)
|
||||
{
|
||||
/* this is the real front buffer which is only used for blitting to */
|
||||
intelScreen->front_region =
|
||||
intel_recreate_static(intelScreen,
|
||||
intelScreen->front_region,
|
||||
@@ -601,6 +602,7 @@ intelCreateBuffer(__DRIscreenPrivate * driScrnPriv,
|
||||
|
||||
_mesa_initialize_framebuffer(&intel_fb->Base, mesaVis);
|
||||
|
||||
#if 0
|
||||
/* setup the hardware-based renderbuffers */
|
||||
{
|
||||
intel_fb->color_rb[0]
|
||||
@@ -615,7 +617,6 @@ intelCreateBuffer(__DRIscreenPrivate * driScrnPriv,
|
||||
&intel_fb->color_rb[0]->Base);
|
||||
}
|
||||
|
||||
#if 0
|
||||
if (mesaVis->doubleBufferMode) {
|
||||
intel_fb->color_rb[1]
|
||||
= intel_create_renderbuffer(rgbFormat,
|
||||
@@ -672,11 +673,22 @@ intelCreateBuffer(__DRIscreenPrivate * driScrnPriv,
|
||||
}
|
||||
|
||||
#else
|
||||
{
|
||||
/* fake frontbuffer */
|
||||
/* XXX allocation should only happen in the unusual case
|
||||
it's actually needed */
|
||||
intel_fb->color_rb[0]
|
||||
= intel_new_renderbuffer_fb(NULL, rgbFormat);
|
||||
_mesa_add_renderbuffer(&intel_fb->Base, BUFFER_FRONT_LEFT,
|
||||
&intel_fb->color_rb[0]->Base);
|
||||
}
|
||||
|
||||
if (mesaVis->doubleBufferMode) {
|
||||
intel_fb->color_rb[1]
|
||||
= intel_new_renderbuffer_fb(NULL, rgbFormat);
|
||||
_mesa_add_renderbuffer(&intel_fb->Base, BUFFER_BACK_LEFT,
|
||||
&intel_fb->color_rb[1]->Base);
|
||||
|
||||
if (screen->third.handle) {
|
||||
struct gl_renderbuffer *tmp_rb = NULL;
|
||||
|
||||
|
||||
@@ -205,25 +205,17 @@ intelCalcViewport(GLcontext * ctx)
|
||||
GLfloat *m = intel->ViewportMatrix.m;
|
||||
GLfloat yScale, yBias;
|
||||
|
||||
if (ctx->DrawBuffer->Name) {
|
||||
/* User created FBO */
|
||||
struct intel_renderbuffer *irb
|
||||
struct intel_renderbuffer *irb
|
||||
= intel_renderbuffer(ctx->DrawBuffer->_ColorDrawBuffers[0][0]);
|
||||
if (irb && !irb->RenderToTexture) {
|
||||
/* y=0=top */
|
||||
yScale = -1.0;
|
||||
yBias = irb->Base.Height;
|
||||
}
|
||||
else {
|
||||
/* y=0=bottom */
|
||||
yScale = 1.0;
|
||||
yBias = 0.0;
|
||||
}
|
||||
if (irb && !irb->RenderToTexture) {
|
||||
/* y=0=top */
|
||||
yScale = -1.0;
|
||||
yBias = irb->Base.Height;
|
||||
}
|
||||
else {
|
||||
/* window buffer, y=0=top */
|
||||
yScale = -1.0;
|
||||
yBias = (intel->driDrawable) ? intel->driDrawable->h : 0.0F;
|
||||
/* y=0=bottom */
|
||||
yScale = 1.0;
|
||||
yBias = 0.0;
|
||||
}
|
||||
|
||||
m[MAT_SX] = v[MAT_SX];
|
||||
|
||||
Reference in New Issue
Block a user