xserver

xserver with xephyr scale patch
git clone https://git.neptards.moe/u3shit/xserver.git
Log | Files | Refs | README | LICENSE

windowsdri.c (7713B)


      1 /*
      2  * Copyright © 2014 Jon Turney
      3  *
      4  * Permission is hereby granted, free of charge, to any person obtaining a
      5  * copy of this software and associated documentation files (the "Software"),
      6  * to deal in the Software without restriction, including without limitation
      7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      8  * and/or sell copies of the Software, and to permit persons to whom the
      9  * Software is furnished to do so, subject to the following conditions:
     10  *
     11  * The above copyright notice and this permission notice (including the next
     12  * paragraph) shall be included in all copies or substantial portions of the
     13  * Software.
     14  *
     15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
     21  * IN THE SOFTWARE.
     22  */
     23 
     24 #ifdef HAVE_DIX_CONFIG_H
     25 #include <dix-config.h>
     26 #endif
     27 
     28 #include <X11/X.h>
     29 #include <X11/Xproto.h>
     30 #include <X11/extensions/windowsdristr.h>
     31 
     32 #include "dixstruct.h"
     33 #include "extnsionst.h"
     34 #include "scrnintstr.h"
     35 #include "swaprep.h"
     36 #include "protocol-versions.h"
     37 #include "windowsdri.h"
     38 #include "glx/dri_helpers.h"
     39 
     40 static int WindowsDRIErrorBase = 0;
     41 static unsigned char WindowsDRIReqCode = 0;
     42 static int WindowsDRIEventBase = 0;
     43 
     44 static void
     45 WindowsDRIResetProc(ExtensionEntry* extEntry)
     46 {
     47 }
     48 
     49 static int
     50 ProcWindowsDRIQueryVersion(ClientPtr client)
     51 {
     52     xWindowsDRIQueryVersionReply rep;
     53 
     54     REQUEST_SIZE_MATCH(xWindowsDRIQueryVersionReq);
     55     rep.type = X_Reply;
     56     rep.length = 0;
     57     rep.sequenceNumber = client->sequence;
     58     rep.majorVersion = SERVER_WINDOWSDRI_MAJOR_VERSION;
     59     rep.minorVersion = SERVER_WINDOWSDRI_MINOR_VERSION;
     60     rep.patchVersion = SERVER_WINDOWSDRI_PATCH_VERSION;
     61     if (client->swapped) {
     62         swaps(&rep.sequenceNumber);
     63         swapl(&rep.length);
     64         swaps(&rep.majorVersion);
     65         swaps(&rep.minorVersion);
     66         swapl(&rep.patchVersion);
     67     }
     68     WriteToClient(client, sizeof(xWindowsDRIQueryVersionReply), &rep);
     69     return Success;
     70 }
     71 
     72 static int
     73 ProcWindowsDRIQueryDirectRenderingCapable(ClientPtr client)
     74 {
     75     xWindowsDRIQueryDirectRenderingCapableReply rep;
     76 
     77     REQUEST(xWindowsDRIQueryDirectRenderingCapableReq);
     78     REQUEST_SIZE_MATCH(xWindowsDRIQueryDirectRenderingCapableReq);
     79     rep.type = X_Reply;
     80     rep.length = 0;
     81     rep.sequenceNumber = client->sequence;
     82 
     83     if (!client->local)
     84         rep.isCapable = 0;
     85     else
     86         rep.isCapable = glxWinGetScreenAiglxIsActive(screenInfo.screens[stuff->screen]);
     87 
     88     if (client->swapped) {
     89         swaps(&rep.sequenceNumber);
     90         swapl(&rep.length);
     91     }
     92 
     93     WriteToClient(client,
     94                   sizeof(xWindowsDRIQueryDirectRenderingCapableReply),
     95                   &rep);
     96     return Success;
     97 }
     98 
     99 static int
    100 ProcWindowsDRIQueryDrawable(ClientPtr client)
    101 {
    102     xWindowsDRIQueryDrawableReply rep;
    103     int rc;
    104 
    105     REQUEST(xWindowsDRIQueryDrawableReq);
    106     REQUEST_SIZE_MATCH(xWindowsDRIQueryDrawableReq);
    107     rep.type = X_Reply;
    108     rep.length = 0;
    109     rep.sequenceNumber = client->sequence;
    110 
    111     rc = glxWinQueryDrawable(client, stuff->drawable, &(rep.drawable_type), &(rep.handle));
    112 
    113     if (rc)
    114         return rc;
    115 
    116     if (client->swapped) {
    117         swaps(&rep.sequenceNumber);
    118         swapl(&rep.length);
    119         swapl(&rep.handle);
    120         swapl(&rep.drawable_type);
    121     }
    122 
    123     WriteToClient(client, sizeof(xWindowsDRIQueryDrawableReply), &rep);
    124     return Success;
    125 }
    126 
    127 static int
    128 ProcWindowsDRIFBConfigToPixelFormat(ClientPtr client)
    129 {
    130     xWindowsDRIFBConfigToPixelFormatReply rep;
    131 
    132     REQUEST(xWindowsDRIFBConfigToPixelFormatReq);
    133     REQUEST_SIZE_MATCH(xWindowsDRIFBConfigToPixelFormatReq);
    134     rep.type = X_Reply;
    135     rep.length = 0;
    136     rep.sequenceNumber = client->sequence;
    137 
    138     rep.pixelFormatIndex = glxWinFBConfigIDToPixelFormatIndex(stuff->screen, stuff->fbConfigID);
    139 
    140     if (client->swapped) {
    141         swaps(&rep.sequenceNumber);
    142         swapl(&rep.length);
    143         swapl(&rep.pixelFormatIndex);
    144     }
    145 
    146     WriteToClient(client, sizeof(xWindowsDRIFBConfigToPixelFormatReply), &rep);
    147     return Success;
    148 }
    149 
    150 /* dispatch */
    151 
    152 static int
    153 ProcWindowsDRIDispatch(ClientPtr client)
    154 {
    155     REQUEST(xReq);
    156 
    157     switch (stuff->data) {
    158     case X_WindowsDRIQueryVersion:
    159         return ProcWindowsDRIQueryVersion(client);
    160 
    161     case X_WindowsDRIQueryDirectRenderingCapable:
    162         return ProcWindowsDRIQueryDirectRenderingCapable(client);
    163     }
    164 
    165     if (!client->local)
    166         return WindowsDRIErrorBase + WindowsDRIClientNotLocal;
    167 
    168     switch (stuff->data) {
    169     case X_WindowsDRIQueryDrawable:
    170         return ProcWindowsDRIQueryDrawable(client);
    171 
    172     case X_WindowsDRIFBConfigToPixelFormat:
    173         return ProcWindowsDRIFBConfigToPixelFormat(client);
    174 
    175     default:
    176         return BadRequest;
    177     }
    178 }
    179 
    180 static void
    181 SNotifyEvent(xWindowsDRINotifyEvent *from,
    182              xWindowsDRINotifyEvent *to)
    183 {
    184     to->type = from->type;
    185     to->kind = from->kind;
    186     cpswaps(from->sequenceNumber, to->sequenceNumber);
    187     cpswapl(from->time, to->time);
    188 }
    189 
    190 static int
    191 SProcWindowsDRIQueryVersion(ClientPtr client)
    192 {
    193     REQUEST(xWindowsDRIQueryVersionReq);
    194     swaps(&stuff->length);
    195     return ProcWindowsDRIQueryVersion(client);
    196 }
    197 
    198 static int
    199 SProcWindowsDRIQueryDirectRenderingCapable(ClientPtr client)
    200 {
    201     REQUEST(xWindowsDRIQueryDirectRenderingCapableReq);
    202     swaps(&stuff->length);
    203     swapl(&stuff->screen);
    204     return ProcWindowsDRIQueryDirectRenderingCapable(client);
    205 }
    206 
    207 static int
    208 SProcWindowsDRIQueryDrawable(ClientPtr client)
    209 {
    210     REQUEST(xWindowsDRIQueryDrawableReq);
    211     swaps(&stuff->length);
    212     swapl(&stuff->screen);
    213     swapl(&stuff->drawable);
    214     return ProcWindowsDRIQueryDrawable(client);
    215 }
    216 
    217 static int
    218 SProcWindowsDRIFBConfigToPixelFormat(ClientPtr client)
    219 {
    220     REQUEST(xWindowsDRIFBConfigToPixelFormatReq);
    221     swaps(&stuff->length);
    222     swapl(&stuff->screen);
    223     swapl(&stuff->fbConfigID);
    224     return ProcWindowsDRIFBConfigToPixelFormat(client);
    225 }
    226 
    227 static int
    228 SProcWindowsDRIDispatch(ClientPtr client)
    229 {
    230     REQUEST(xReq);
    231 
    232     switch (stuff->data) {
    233     case X_WindowsDRIQueryVersion:
    234         return SProcWindowsDRIQueryVersion(client);
    235 
    236     case X_WindowsDRIQueryDirectRenderingCapable:
    237         return SProcWindowsDRIQueryDirectRenderingCapable(client);
    238     }
    239 
    240     if (!client->local)
    241         return WindowsDRIErrorBase + WindowsDRIClientNotLocal;
    242 
    243     switch (stuff->data) {
    244     case X_WindowsDRIQueryDrawable:
    245         return SProcWindowsDRIQueryDrawable(client);
    246 
    247     case X_WindowsDRIFBConfigToPixelFormat:
    248         return SProcWindowsDRIFBConfigToPixelFormat(client);
    249 
    250     default:
    251         return BadRequest;
    252     }
    253 }
    254 
    255 void
    256 WindowsDRIExtensionInit(void)
    257 {
    258     ExtensionEntry* extEntry;
    259 
    260     if ((extEntry = AddExtension(WINDOWSDRINAME,
    261                                  WindowsDRINumberEvents,
    262                                  WindowsDRINumberErrors,
    263                                  ProcWindowsDRIDispatch,
    264                                  SProcWindowsDRIDispatch,
    265                                  WindowsDRIResetProc,
    266                                  StandardMinorOpcode))) {
    267         size_t i;
    268         WindowsDRIReqCode = (unsigned char)extEntry->base;
    269         WindowsDRIErrorBase = extEntry->errorBase;
    270         WindowsDRIEventBase = extEntry->eventBase;
    271         for (i = 0; i < WindowsDRINumberEvents; i++)
    272             EventSwapVector[WindowsDRIEventBase + i] = (EventSwapPtr)SNotifyEvent;
    273     }
    274 }