diff --git a/src/i830_display.c b/src/i830_display.c index 6fe7be7..83ae08d 100644 --- a/src/i830_display.c +++ b/src/i830_display.c @@ -35,6 +35,7 @@ #include #include #include +#include #include "xf86.h" #include "i830.h" @@ -498,6 +499,51 @@ i830_pipe_a_require_deactivate (ScrnInfoPtr scrn) return; } +#define FBC_TAG0 0x3300 +#define FBC_NUM_TAGS 49 +#define FBC_TAG_MODIFIED 0 +#define FBC_TAG_UNCOMPRESSED 1 +#define FBC_TAG_UNCOMPRESSIBLE 2 +#define FBC_TAG_COMPRESSED 3 +static void i830_fbc_dump_tags(void) +{ + ScrnInfoPtr pScrn = xf86Screens[0]; + I830Ptr pI830 = I830PTR(pScrn); + uint32_t tag[FBC_NUM_TAGS]; + int modified = 0, uncompressed = 0, uncompressible = 0, compressed = 0; + int i, j; + + for (i = 0; i < FBC_NUM_TAGS; i++) { + tag[i] = INREG(FBC_TAG0 + i); + for (j = 0; j < 32; j += 2) { + uint32_t val = (tag[i] >> j) & 3; + /* Each value corresponds to a status for two lines */ + if (val == FBC_TAG_MODIFIED) + modified += 2; + else if (val == FBC_TAG_UNCOMPRESSED) + uncompressed += 2; + else if (val == FBC_TAG_UNCOMPRESSIBLE) + uncompressible += 2; + else if (val == FBC_TAG_COMPRESSED) + compressed += 2; + } + } + + ErrorF("FBC_CONTROL: 0x%08x\n", INREG(FBC_CONTROL)); + ErrorF("FBC_STATUS: 0x%08x\n", INREG(FBC_STATUS)); + ErrorF("FBC TAG status:\n"); + ErrorF("\tmodified: %d\n", modified); + ErrorF("\tuncompressed: %d\n", uncompressed); + ErrorF("\tuncompressible: %d\n", uncompressible); + ErrorF("\tcompressed: %d\n", compressed); +} + +static void fbc_debug(int signo) +{ + i830_fbc_dump_tags(); + alarm(5); +} + static Bool i830_use_fb_compression(xf86CrtcPtr crtc) { @@ -595,6 +641,11 @@ i830_enable_fb_compression(xf86CrtcPtr crtc) xf86DrvMsg(pScrn->scrnIndex, X_INFO, "fbc enabled on plane %c\n", pipe ? 'b' : 'a'); + { + struct sigaction debug = { .sa_handler = fbc_debug }; + sigaction(SIGALRM, &debug, NULL); + alarm(5); + } } static void