xserver-multidpi/hw/xwin/glx/dri_helpers.c

121 lines
4.1 KiB
C
Raw Normal View History

Add Windows-DRI extension If windowsdriproto headers are available, build a Windows-DRI extension, which supports requests to enable local clients to directly render GL to a Windows drawable: - a query to check if WGL is being used on a screen - a query to map a fbconfigID to a native pixelformatindex - a query to map a drawable to a native handle Windows-DRI can only be useful if we are using WGL, so make an note if WGL is active on a screen. Make validGlxDrawable() public Adjust glxWinSetPixelFormat() so it doesn't require a context, just a screen and config. That enables factoring out the deferred drawable creation code as glxWinDeferredCreateDrawable() Enhance glxWinDeferredCreateDrawable(), so that pixmaps are placed into a file mapping, so they exist in memory which can be shared with the direct rendering process. Currently, this file mapping is accessed by a name generated from the XID. This will not be unique across multiple server instances. It would perhaps be better, although more complicated, to use an anonymous file mapping, and then duplicate the handle for the direct rendering process. Use glxWinDeferredCreateDrawable() to ensure the native handle exists for the Windows-DRI query to map a drawable to native handle. v2: Various printf format warning fixes v3: Fix format warnings on x86 Move some uninteresting windows-dri output to debug log level v4: check for windowsdriproto when --enable-windowsdri use windowsdriproto_CFLAGS Signed-off-by: Jon Turney <jon.turney@dronecode.org.uk> Reviewed-by: Colin Harrison <colin.harrison@virgin.net>
2014-07-24 13:29:41 +02:00
/*
* Copyright © 2014 Jon Turney
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
#ifdef HAVE_XWIN_CONFIG_H
#include <xwin-config.h>
#endif
#include <glx/glxserver.h>
#include <glx/glxutil.h>
#include <X11/extensions/windowsdriconst.h>
#include "indirect.h"
#include "winpriv.h"
#include "dri_helpers.h"
#include "win.h"
int
glxWinQueryDrawable(ClientPtr client, XID drawId, unsigned int *type, unsigned int *handle)
{
__GLXWinDrawable *pDrawable;
int err;
if (validGlxDrawable(client, drawId, GLX_DRAWABLE_ANY,
DixReadAccess, (__GLXdrawable **)&pDrawable, &err)) {
switch (pDrawable->base.type)
{
case GLX_DRAWABLE_WINDOW:
{
HWND h = winGetWindowInfo((WindowPtr)(pDrawable->base.pDraw));
*handle = (uintptr_t)h;
*type = WindowsDRIDrawableWindow;
}
break;
case GLX_DRAWABLE_PIXMAP:
glxWinDeferredCreateDrawable(pDrawable, pDrawable->base.config);
*handle = pDrawable->base.pDraw->id;
// The XID is used to create a unique name for a file mapping
// shared with the requesting process
//
// XXX: Alternatively, we could use an anonymous file mapping
// and use DuplicateHandle to make pDrawable->hSection available
// to the requesting process... ?
*type = WindowsDRIDrawablePixmap;
break;
case GLX_DRAWABLE_PBUFFER:
glxWinDeferredCreateDrawable(pDrawable, pDrawable->base.config);
*handle = (uintptr_t)(pDrawable->hPbuffer);
*type = WindowsDRIDrawablePbuffer;
break;
default:
assert(FALSE);
*handle = 0;
}
}
else {
HWND h;
/* The drawId XID doesn't identify a GLX drawable. The only other valid
alternative is that it is the XID of a window drawable that is being
used by the pre-GLX 1.3 interface */
DrawablePtr pDraw;
int rc = dixLookupDrawable(&pDraw, drawId, client, 0, DixGetAttrAccess);
if (rc != Success || pDraw->type != DRAWABLE_WINDOW) {
return err;
}
h = winGetWindowInfo((WindowPtr)(pDraw));
*handle = (uintptr_t)h;
*type = WindowsDRIDrawableWindow;
}
winDebug("glxWinQueryDrawable: type %d, handle %p\n", *type, (void *)(uintptr_t)*handle);
return Success;
}
int
glxWinFBConfigIDToPixelFormatIndex(int scr, int fbConfigID)
{
__GLXscreen *screen = glxGetScreen(screenInfo.screens[scr]);
__GLXconfig *c;
for (c = screen->fbconfigs;
c != NULL;
c = c->next) {
if (c->fbconfigID == fbConfigID)
return ((GLXWinConfig *)c)->pixelFormatIndex;
}
return 0;
}
Bool
glxWinGetScreenAiglxIsActive(ScreenPtr pScreen)
{
winPrivScreenPtr pWinScreen = winGetScreenPriv(pScreen);
return pWinScreen->fNativeGlActive;
}