xpra icon
Bug tracker and wiki

Ticket #1577: vgl-30bpc.patch

File vgl-30bpc.patch, 8.0 KB (added by Antoine Martin, 3 years ago)

patch with debug which adds 30bpc to the X11 transport

  • include/fbx.h

    diff --git a/include/fbx.h b/include/fbx.h
    index c3a64256..994b3117 100644
    a b typedef struct 
    5555
    5656
    5757/* Pixel formats */
    58 #define FBX_FORMATS 7
    59 enum { FBX_RGB, FBX_RGBA, FBX_BGR, FBX_BGRA, FBX_ABGR, FBX_ARGB, FBX_INDEX };
     58#define FBX_FORMATS 8
     59enum { FBX_RGB, FBX_RGBA, FBX_BGR, FBX_BGRA, FBX_ABGR, FBX_ARGB, FBX_r210, FBX_INDEX };
    6060
    6161static const int fbx_ps[FBX_FORMATS]=
    62         { 3, 4, 3, 4, 4, 4, 1 };
     62        { 3, 4, 3, 4, 4, 4, 4, 1 };
    6363static const int fbx_bgr[FBX_FORMATS]=
    64         { 0, 0, 1, 1, 1, 0, 0 };
     64        { 0, 0, 1, 1, 1, 0, 0, 0 };
    6565static const int fbx_alphafirst[FBX_FORMATS]=
    66         { 0, 0, 0, 0, 1, 1, 0 };
     66        { 0, 0, 0, 0, 1, 1, 0, 0 };
    6767static const int fbx_roffset[FBX_FORMATS]=
    68         { 0, 0, 2, 2, 3, 1, 0 };
     68        { 0, 0, 2, 2, 3, 1, 0, 0 };
    6969static const int fbx_goffset[FBX_FORMATS]=
    70         { 1, 1, 1, 1, 2, 2, 0 };
     70        { 1, 1, 1, 1, 2, 2, 1, 0 };
    7171static const int fbx_boffset[FBX_FORMATS]=
    72         { 2, 2, 0, 0, 1, 3, 0 };
     72        { 2, 2, 0, 0, 1, 3, 2, 0 };
    7373
    7474
    7575typedef struct _fbx_struct
  • server/VirtualDrawable.cpp

    diff --git a/server/VirtualDrawable.cpp b/server/VirtualDrawable.cpp
    index 2604440f..a13b654a 100644
    a b VirtualDrawable::OGLDrawable::OGLDrawable(int width_, int height_, int depth_, 
    9292        glxDraw(0), width(width_), height(height_), depth(depth_), config(config_),
    9393        format(0), pm(0), win(0), isPixmap(true)
    9494{
     95        printf("OGLDrawable %ix%i depth=%i\n", width, height, depth);
    9596        if(!config_ || width_<1 || height_<1 || depth_<0)
    9697                _throw("Invalid argument");
    9798
    void VirtualDrawable::OGLDrawable::setVisAttribs(void) 
    118119{
    119120        if(glxvisual::visAttrib3D(config, GLX_STEREO))
    120121                stereo=true;
    121         int pixelsize=glxvisual::visAttrib3D(config, GLX_RED_SIZE)
     122        int pixelsize_noalpha=glxvisual::visAttrib3D(config, GLX_RED_SIZE)
    122123                +glxvisual::visAttrib3D(config, GLX_GREEN_SIZE)
    123                 +glxvisual::visAttrib3D(config, GLX_BLUE_SIZE)
     124                +glxvisual::visAttrib3D(config, GLX_BLUE_SIZE);
     125        int pixelsize=pixelsize_noalpha
    124126                +glxvisual::visAttrib3D(config, GLX_ALPHA_SIZE);
    125127
    126         if(pixelsize==32)
     128        printf("setVisAttribs() pixelsize=%i\n", pixelsize);
     129        if(pixelsize_noalpha==30)
     130        {
     131                format=GL_RGB10_A2;
     132        }
     133        else if(pixelsize==32)
    127134        {
    128135                #ifdef GL_BGRA_EXT
    129136                if(littleendian()) format=GL_BGRA_EXT;
    static const char *formatString(int format) 
    319326                #endif
    320327                case GL_RED:  case GL_GREEN:  case GL_BLUE:
    321328                        return "COMPONENT";
     329                case GL_RGB10_A2:
     330                        return "r210";
    322331                default:
    323332                        return "????";
    324333        }
    static const char *formatString(int format) 
    328337void VirtualDrawable::readPixels(GLint x, GLint y, GLint width, GLint pitch,
    329338        GLint height, GLenum format, int ps, GLubyte *bits, GLint buf, bool stereo)
    330339{
     340        printf("readPixels format=%s (%i), ps=%i\n", formatString(format), format, ps);
    331341        double t0=0.0, tRead, tTotal;
    332342
    333343        // Whenever the readback format changes (perhaps due to switching
    void VirtualDrawable::readPixels(GLint x, GLint y, GLint width, GLint pitch, 
    433443        while(e!=GL_NO_ERROR) e=_glGetError();  // Clear previous error
    434444        profReadback.startFrame();
    435445        if(usePBO) t0=getTime();
    436         _glReadPixels(x, y, width, height, format, GL_UNSIGNED_BYTE,
     446        int type = GL_UNSIGNED_BYTE;
     447        if(oglDraw->getFormat()==GL_RGB10_A2) {
     448                type = GL_UNSIGNED_INT_2_10_10_10_REV;
     449        }
     450        _glReadPixels(x, y, width, height, format, type,
    437451                usePBO? NULL:bits);
    438452
    439453        if(usePBO)
    void VirtualDrawable::readPixels(GLint x, GLint y, GLint width, GLint pitch, 
    527541void VirtualDrawable::copyPixels(GLint srcX, GLint srcY, GLint width,
    528542        GLint height, GLint destX, GLint destY, GLXDrawable draw)
    529543{
     544        printf("copyPixels\n");
    530545        if(!ctx)
    531546        {
    532547                if(!isInit())
  • server/VirtualPixmap.cpp

    diff --git a/server/VirtualPixmap.cpp b/server/VirtualPixmap.cpp
    index 6d0f9bc8..29554c71 100644
    a b void VirtualPixmap::readback(void) 
    114114                default:
    115115                        _throw("Unsupported pixel format");
    116116        }
     117        printf("VirtualPixmap.readback()\n");
    117118        readPixels(0, 0, min(width, frame->hdr.framew), frame->pitch,
    118119                min(height, frame->hdr.frameh), format, frame->pixelSize, bits, GL_FRONT,
    119120                false);
  • server/VirtualWin.cpp

    diff --git a/server/VirtualWin.cpp b/server/VirtualWin.cpp
    index ffc3e332..a6997af3 100644
    a b void VirtualWin::sendPlugin(GLint drawBuf, bool spoilLast, bool sync, 
    427427void VirtualWin::sendVGL(GLint drawBuf, bool spoilLast, bool doStereo,
    428428        int stereoMode, int compress, int qual, int subsamp)
    429429{
     430        printf("sendVGL()\n");
    430431        int w=oglDraw->getWidth(), h=oglDraw->getHeight();
    431432
    432433        if(spoilLast && fconfig.spoil && !vglconn->isReady())
    void VirtualWin::sendVGL(GLint drawBuf, bool spoilLast, bool doStereo, 
    491492void VirtualWin::sendX11(GLint drawBuf, bool spoilLast, bool sync,
    492493        bool doStereo, int stereoMode)
    493494{
     495        printf("sendX11() format=%i\n", oglDraw->getFormat());
    494496        int width=oglDraw->getWidth(), height=oglDraw->getHeight();
    495497
    496498        FBXFrame *f;
  • server/faker-glx.cpp

    diff --git a/server/faker-glx.cpp b/server/faker-glx.cpp
    index d5b27ffe..a9203772 100644
    a b static VisualID matchVisual(Display *dpy, GLXFBConfig config) 
    188188                // Failing that, we try to find a 24-bit TrueColor mono visual.
    189189                if(!vid)
    190190                        vid=glxvisual::matchVisual2D(dpy, screen, 24, TrueColor, 0, 0, 0);
     191                vglout.print("[VGL] vid=0x%.8x\n", vid);
    191192        }
    192193        if(vid) cfghash.add(dpy, config, vid);
    193194        return vid;
    GLXFBConfig *glXChooseFBConfig(Display *dpy, int screen, 
    262263
    263264        TRY();
    264265
     266        vglout.print("[VGL] glXChooseFBConfig 0x%.8x\n", dpy);
    265267        // If this is called internally from within another GLX function, then use
    266268        // the real function.
    267269        if(isExcluded(dpy))
    XVisualInfo *glXChooseVisual(Display *dpy, int screen, int *attrib_list) 
    378380
    379381        TRY();
    380382
     383        vglout.print("[VGL] glXChooseVisual 0x%.8x\n", dpy);
    381384        if(isExcluded(dpy))
    382385                return _glXChooseVisual(dpy, screen, attrib_list);
    383386
    XVisualInfo *glXChooseVisual(Display *dpy, int screen, int *attrib_list) 
    437440        if(vtemp)
    438441        {
    439442                if(vtemp->depth==32) depth=32;
     443                if(vtemp->depth==30) depth=30;
    440444                XFree(vtemp);
    441445        }
    442446
    GLXContext glXCreateContext(Display *dpy, XVisualInfo *vis, 
    505509
    506510        TRY();
    507511
     512        vglout.print("[VGL] glXCreateContext 0x%.8x\n", dpy);
    508513        if(isExcluded(dpy))
    509514                return _glXCreateContext(dpy, vis, share_list, direct);
    510515
  • util/fbx.c

    diff --git a/util/fbx.c b/util/fbx.c
    index 2aed8e59..ed3e7e4c 100644
    a b static int errorLine=-1; 
    2828static FILE *warningFile=NULL;
    2929
    3030static const int fbx_rmask[FBX_FORMATS]=
    31         { 0x0000FF, 0x0000FF, 0xFF0000, 0xFF0000, 0x0000FF, 0xFF0000, 0 };
     31        { 0x0000FF, 0x0000FF, 0xFF0000, 0xFF0000, 0x0000FF, 0xFF0000, 0x3FF00000, 0 };
    3232static const int fbx_gmask[FBX_FORMATS]=
    33         { 0x00FF00, 0x00FF00, 0x00FF00, 0x00FF00, 0x00FF00, 0x00FF00, 0 };
     33        { 0x00FF00, 0x00FF00, 0x00FF00, 0x00FF00, 0x00FF00, 0x00FF00, 0x000ffc00, 0 };
    3434static const int fbx_bmask[FBX_FORMATS]=
    35         { 0xFF0000, 0xFF0000, 0x0000FF, 0x0000FF, 0xFF0000, 0x0000FF, 0 };
     35        { 0xFF0000, 0xFF0000, 0x0000FF, 0x0000FF, 0xFF0000, 0x0000FF, 0x000003ff, 0 };
    3636static const char *formatName[FBX_FORMATS]=
    37         { "RGB", "RGBA", "BGR", "BGRA", "ABGR", "ARGB", "INDEX" };
     37        { "RGB", "RGBA", "BGR", "BGRA", "ABGR", "ARGB", "r210", "INDEX" };
    3838
    3939
    4040#if defined(_WIN32)
    int fbx_init(fbx_struct *fb, fbx_wh wh, int width_, int height_, int useShm) 
    390390        }
    391391
    392392        fb->format=-1;
    393         for(i=0; i<FBX_FORMATS; i++)
     393        printf("[VGL] rmask=%.8x, gmask=%.8x, bmask=%.8x, ps=%i, alphafirst=%i\n", rmask, gmask, bmask, ps, alphaFirst);
     394        for(i=0; i<FBX_FORMATS; i++) {
    394395                if(rmask==fbx_rmask[i] && gmask==fbx_gmask[i] && bmask==fbx_bmask[i]
    395396                        && ps==fbx_ps[i] && fbx_alphafirst[i]==alphaFirst) fb->format=i;
    396         if(fb->format==-1) _throw("Display has unsupported pixel format");
     397                printf("[VGL] [%i] rmask=%.8x, gmask=%.8x, bmask=%.8x, ps=%i, alphafirst=%i\n", i, fbx_rmask[i], fbx_gmask[i], fbx_bmask[i], fbx_ps[i], fbx_alphafirst[i]);
     398        }
     399        if(fb->format==-1) _throw("Display2 has unsupported pixel format");
    397400
    398401        fb->bits=fb->xi->data;
    399402        fb->pixmap=pixmap;