diff options
| -rw-r--r-- | src/gallium/state_trackers/xorg/xorg_crtc.c | 15 | ||||
| -rw-r--r-- | src/gallium/state_trackers/xorg/xorg_driver.c | 65 | ||||
| -rw-r--r-- | src/gallium/state_trackers/xorg/xorg_tracker.h | 1 | 
3 files changed, 80 insertions, 1 deletions
| diff --git a/src/gallium/state_trackers/xorg/xorg_crtc.c b/src/gallium/state_trackers/xorg/xorg_crtc.c index 28e30e09ff..71f7b8c21d 100644 --- a/src/gallium/state_trackers/xorg/xorg_crtc.c +++ b/src/gallium/state_trackers/xorg/xorg_crtc.c @@ -133,6 +133,16 @@ crtc_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,      if (ret)  	return FALSE; +    /* Only set gamma when needed, to avoid unneeded delays. */ +#if defined(XF86_CRTC_VERSION) && XF86_CRTC_VERSION >= 3 +    if (!crtc->active) +#endif +	crtc->funcs->gamma_set(crtc, crtc->gamma_red, crtc->gamma_green, +			       crtc->gamma_blue, crtc->gamma_size); + +#if defined(XF86_CRTC_VERSION) && XF86_CRTC_VERSION >= 3 +    crtc->active = TRUE; +#endif      crtc->x = x;      crtc->y = y;      crtc->mode = *mode; @@ -145,7 +155,10 @@ static void  crtc_gamma_set(xf86CrtcPtr crtc, CARD16 * red, CARD16 * green, CARD16 * blue,  	       int size)  { -    /* XXX: hockup */ +    modesettingPtr ms = modesettingPTR(crtc->scrn); +    struct crtc_private *crtcp = crtc->driver_private; + +    drmModeCrtcSetGamma(ms->fd, crtcp->drm_crtc->crtc_id, size, red, green, blue);  }  #if 0 /* Implement and enable to enable rotation and reflection. */ diff --git a/src/gallium/state_trackers/xorg/xorg_driver.c b/src/gallium/state_trackers/xorg/xorg_driver.c index 66685ecec6..33bcacdcc2 100644 --- a/src/gallium/state_trackers/xorg/xorg_driver.c +++ b/src/gallium/state_trackers/xorg/xorg_driver.c @@ -44,6 +44,7 @@  #include "xf86Crtc.h"  #include "miscstruct.h"  #include "dixstruct.h" +#include "xf86cmap.h"  #include "xf86xv.h"  #include "xorgVersion.h"  #ifndef XSERVER_LIBPCIACCESS @@ -414,6 +415,7 @@ drv_pre_init(ScrnInfoPtr pScrn, int flags)  	return FALSE;      switch (pScrn->depth) { +    case 8:      case 15:      case 16:      case 24: @@ -677,6 +679,65 @@ drv_set_master(ScrnInfoPtr pScrn)  } +static void drv_load_palette(ScrnInfoPtr pScrn, int numColors, +			     int *indices, LOCO *colors, VisualPtr pVisual) +{ +    xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); +    modesettingPtr ms = modesettingPTR(pScrn); +    int index, j, i; +    int c; + +    switch(pScrn->depth) { +    case 15: +	for (i = 0; i < numColors; i++) { +	    index = indices[i]; +	    for (j = 0; j < 8; j++) { +		ms->lut_r[index * 8 + j] = colors[index].red << 8; +		ms->lut_g[index * 8 + j] = colors[index].green << 8; +		ms->lut_b[index * 8 + j] = colors[index].blue << 8; +	    } +	} +	break; +    case 16: +	for (i = 0; i < numColors; i++) { +	    index = indices[i]; + +	    if (index < 32) { +		for (j = 0; j < 8; j++) { +		    ms->lut_r[index * 8 + j] = colors[index].red << 8; +		    ms->lut_b[index * 8 + j] = colors[index].blue << 8; +		} +	    } + +	    for (j = 0; j < 4; j++) { +		ms->lut_g[index * 4 + j] = colors[index].green << 8; +	    } +	} +	break; +    default: +	for (i = 0; i < numColors; i++) { +	    index = indices[i]; +	    ms->lut_r[index] = colors[index].red << 8; +	    ms->lut_g[index] = colors[index].green << 8; +	    ms->lut_b[index] = colors[index].blue << 8; +	} +	break; +    } + +    for (c = 0; c < xf86_config->num_crtc; c++) { +	xf86CrtcPtr crtc = xf86_config->crtc[c]; + +	/* Make the change through RandR */ +#ifdef RANDR_12_INTERFACE +	if (crtc->randr_crtc) +	    RRCrtcGammaSet(crtc->randr_crtc, ms->lut_r, ms->lut_g, ms->lut_b); +	else +#endif +	    crtc->funcs->gamma_set(crtc, ms->lut_r, ms->lut_g, ms->lut_b, 256); +    } +} + +  static Bool  drv_screen_init(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)  { @@ -816,6 +877,10 @@ drv_screen_init(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)      if (!miCreateDefColormap(pScreen))  	return FALSE; +    if (!xf86HandleColormaps(pScreen, 256, 8, drv_load_palette, NULL, +			     CMAP_PALETTED_TRUECOLOR | +			     CMAP_RELOAD_ON_MODE_SWITCH)) +	return FALSE;      xf86DPMSInit(pScreen, xf86DPMSSet, 0); diff --git a/src/gallium/state_trackers/xorg/xorg_tracker.h b/src/gallium/state_trackers/xorg/xorg_tracker.h index 56397b8fea..664e8c7573 100644 --- a/src/gallium/state_trackers/xorg/xorg_tracker.h +++ b/src/gallium/state_trackers/xorg/xorg_tracker.h @@ -129,6 +129,7 @@ typedef struct _modesettingRec      /* kms */      struct kms_driver *kms;      struct kms_bo *root_bo; +    uint16_t lut_r[256], lut_g[256], lut_b[256];      /* gallium */      struct pipe_screen *screen; | 
