#define TileW 128
#define TileH 8
-#define REG_DR_DSPASURF 0x7019C
-#define REG_DR_DSPACNTR 0x70180
-#define REG_DR_DSPASTRIDE 0x70188
-#define REG_DR_PIPEACONF 0x70008
+#define REG_DR_DSPASURF 0x7019C
+#define REG_DR_DSPACNTR 0x70180
+#define REG_DR_DSPASTRIDE 0x70188
+#define REG_DR_PIPEACONF 0x70008
-#define REG_DR_DSPBSURF 0x7119C
-#define REG_DR_DSPBCNTR 0x71180
-#define REG_DR_DSPBSTRIDE 0x71188
-#define REG_DR_PIPEBCONF 0x71008
+#define REG_DR_DSPBSURF 0x7119C
+#define REG_DR_DSPBCNTR 0x71180
+#define REG_DR_DSPBSTRIDE 0x71188
+#define REG_DR_PIPEBCONF 0x71008
+
+#define REG_DE_HBLANK_A 0x60004
+#define REG_DE_VBLANK_A 0x60010
extern int vga_passthrough;
uint32_t guest_framebuffer;
static uint8_t *intel_mmio = NULL;
static int intel_force_full_update = 0;
static int intel_have_focus;
-static int TilePitch = 16;
-static int TileX = 1280;
-static int TileY = 1024;
+static int IntelPitch = 16;
+static int IntelX = 1280;
+static int IntelY = 1024;
static DisplayState *lds = NULL;
static uint8_t *old_data = NULL;
static uint32_t intel_fb_base, intel_mmio_base;
return *dspastride;
}
-static inline unsigned int intel_get_tiled_offset(int x, int y)
-{
- return 4 * (y * (TilePitch * TileW * TileH) + x * (TileW * TileH));
-}
-
static inline unsigned int intel_get_offset(DisplayState *ds, int x, int y)
{
return (y * ds->width + x) * 4;
intel_resize(ds, w, h);
return;
}
- if (depth == 32 && w == TileX && h == TileY)
+ if (depth == 32 && w == IntelX && h == IntelY)
ds->shared_buf = 1;
else
ds->shared_buf = 0;
intel_force_linear(0);
}
ds->shared_buf = 0;
- if (intel_have_focus && !old_data && w * h <= TileX * TileY)
+ if (intel_have_focus && !old_data && w * h <= IntelX * IntelY)
set_data_mappings();
- else if (intel_have_focus && old_data && w * h > TileX * TileY)
+ else if (intel_have_focus && old_data && w * h > IntelX * IntelY)
unset_data_mappings(0);
if (!old_data) {
qemu_free(ds->data);
set_data_pointer();
}
if (intel_have_focus)
- memset((unsigned char *)(intel_mem + intel_get_reg(REG_DR_DSPASURF)), 0x0, TileX * TileY);
+ memset((unsigned char *)(intel_mem + intel_get_reg(REG_DR_DSPASURF)), 0x0, IntelX * IntelY);
if (refresh) {
if (old_data) {
unsigned char *s, *d;
{
lds->data = (unsigned char *)(intel_mem + intel_get_reg(REG_DR_DSPASURF));
lds->data = lds->data +
- lds->linesize * ((TileY - lds->height) / 2) +
- 4 * ((TileX - lds->width) / 2);
+ lds->linesize * ((IntelY - lds->height) / 2) +
+ 4 * ((IntelX - lds->width) / 2);
}
static void set_data_mappings(void)
intel_have_focus = focus;
if (focus) {
if (!is_linear()) {
- if (intel_get_reg(REG_DR_DSPASTRIDE) == 0x1000) {
- TilePitch = 8;
- TileX = 1024;
- TileY = 768;
- INTEL_DEBUG("Resolution 1024x768\n");
- } else {
- TilePitch = 16;
- TileX = 1280;
- TileY = 800;
- INTEL_DEBUG("Resolution 1280x800\n");
- }
+ IntelPitch = intel_get_reg(REG_DR_DSPASTRIDE);
+ IntelX = (intel_get_reg(REG_DE_HBLANK_A) & 0xfff) + 1;
+ IntelY = (intel_get_reg(REG_DE_VBLANK_A) & 0xfff) + 1;
+ INTEL_DEBUG("Resolution is %dx%d\n", IntelX, IntelY);
}
refresh = 1;
lds->dpy_resize_shared = intel_resize_shared;