mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 11:18:08 +02:00
i965: fix vblank on 965gm laptops by bringing in code from i915
jbarnes has better fixes for this in 7.1, but for 7.0.2 this seems like the best plan, for distros to pick it up.
This commit is contained in:
parent
2a86a449ca
commit
b3fc9a1585
2 changed files with 45 additions and 1 deletions
|
|
@ -31,7 +31,9 @@
|
|||
#include "intel_regions.h"
|
||||
#include "intel_batchbuffer.h"
|
||||
#include "context.h"
|
||||
#include "utils.h"
|
||||
#include "framebuffer.h"
|
||||
#include "vblank.h"
|
||||
#include "macros.h"
|
||||
#include "swrast/swrast.h"
|
||||
|
||||
|
|
@ -190,8 +192,40 @@ void intelWindowMoved( struct intel_context *intel )
|
|||
}
|
||||
}
|
||||
|
||||
{
|
||||
if (intel->intelScreen->driScrnPriv->ddxMinor >= 7) {
|
||||
volatile drmI830Sarea *sarea = intel->sarea;
|
||||
drm_clip_rect_t drw_rect = { .x1 = dPriv->x, .x2 = dPriv->x + dPriv->w,
|
||||
.y1 = dPriv->y, .y2 = dPriv->y + dPriv->h
|
||||
};
|
||||
drm_clip_rect_t pipeA_rect = { .x1 = sarea->pipeA_x,
|
||||
.x2 = sarea->pipeA_x + sarea->pipeA_w,
|
||||
.y1 = sarea->pipeA_y,
|
||||
.y2 = sarea->pipeA_y + sarea->pipeA_h };
|
||||
drm_clip_rect_t pipeB_rect = { .x1 = sarea->pipeB_x,
|
||||
.x2 = sarea->pipeB_x + sarea->pipeB_w,
|
||||
.y1 = sarea->pipeB_y,
|
||||
.y2 = sarea->pipeB_y + sarea->pipeB_h };
|
||||
GLint areaA = driIntersectArea( drw_rect, pipeA_rect );
|
||||
GLint areaB = driIntersectArea( drw_rect, pipeB_rect );
|
||||
GLuint flags = intel->vblank_flags;
|
||||
|
||||
if (areaB > areaA || (areaA > 0 && areaB > 0)) {
|
||||
flags = intel->vblank_flags | VBLANK_FLAG_SECONDARY;
|
||||
} else {
|
||||
flags = intel->vblank_flags & ~VBLANK_FLAG_SECONDARY;
|
||||
}
|
||||
|
||||
if (flags != intel->vblank_flags) {
|
||||
intel->vblank_flags = flags;
|
||||
driGetCurrentVBlank(dPriv, intel->vblank_flags, &intel->vbl_seq);
|
||||
}
|
||||
} else {
|
||||
intel->vblank_flags &= ~VBLANK_FLAG_SECONDARY;
|
||||
}
|
||||
}
|
||||
_mesa_resize_framebuffer(&intel->ctx,
|
||||
(GLframebuffer*)dPriv->driverPrivate,
|
||||
(GLframebuffer*)dPriv->driverPrivate,
|
||||
dPriv->w, dPriv->h);
|
||||
|
||||
/* Set state we know depends on drawable parameters:
|
||||
|
|
|
|||
|
|
@ -119,6 +119,16 @@ typedef struct {
|
|||
unsigned int depth_tiled;
|
||||
unsigned int rotated_tiled;
|
||||
unsigned int rotated2_tiled;
|
||||
|
||||
int pipeA_x;
|
||||
int pipeA_y;
|
||||
int pipeA_w;
|
||||
int pipeA_h;
|
||||
int pipeB_x;
|
||||
int pipeB_y;
|
||||
int pipeB_w;
|
||||
int pipeB_h;
|
||||
|
||||
} drmI830Sarea;
|
||||
|
||||
/* Flags for perf_boxes
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue