mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-09 02:28:10 +02:00
st/xorg: Flesh out colour map support and support depth 8.
This commit is contained in:
parent
266d8eed69
commit
c7c1e5338c
3 changed files with 80 additions and 1 deletions
|
|
@ -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. */
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue