diff --git a/hw/kdrive/ephyr/ephyrglxext.c b/hw/kdrive/ephyr/ephyrglxext.c index d0380f105..c4e5ba4d4 100644 --- a/hw/kdrive/ephyr/ephyrglxext.c +++ b/hw/kdrive/ephyr/ephyrglxext.c @@ -59,17 +59,22 @@ int ephyrGLXClientInfo(__GLXclientState *cl, GLbyte *pc) ; int ephyrGLXClientInfoSwap(__GLXclientState *cl, GLbyte *pc) ; int ephyrGLXQueryServerString(__GLXclientState *a_cl, GLbyte *a_pc) ; int ephyrGLXQueryServerStringSwap(__GLXclientState *a_cl, GLbyte *a_pc) ; +int ephyrGLXGetFBConfigsSGIX (__GLXclientState *a_cl, GLbyte *a_pc); +int ephyrGLXGetFBConfigsSGIXSwap (__GLXclientState *a_cl, GLbyte *a_pc); Bool ephyrHijackGLXExtension (void) { const void *(*dispatch_functions)[2]; - EPHYR_LOG ("Got GLX extension\n") ; + EPHYR_LOG ("going to hijack some glx entry points ...\n") ; if (!Single_dispatch_info.dispatch_functions) { EPHYR_LOG_ERROR ("could not get dispatch functions table\n") ; return FALSE ; } + /* + * hijack some single entry point dispatch functions + */ dispatch_functions = Single_dispatch_info.dispatch_functions ; EPHYR_RETURN_VAL_IF_FAIL (dispatch_functions, FALSE) ; @@ -83,9 +88,16 @@ ephyrHijackGLXExtension (void) dispatch_functions[X_GLXClientInfo][1] = ephyrGLXClientInfoSwap ; dispatch_functions[X_GLXQueryServerString][0] = ephyrGLXQueryServerString ; - dispatch_functions[X_GLXQueryServerString][1] = ephyrGLXQueryServerStringSwap ; + dispatch_functions[X_GLXQueryServerString][1] = + ephyrGLXQueryServerStringSwap ; - EPHYR_LOG ("hijacked mesa GL to forward requests to host X\n") ; + /* + * hijack some vendor priv entry point dispatch functions + */ + dispatch_functions = VendorPriv_dispatch_info.dispatch_functions ; + dispatch_functions[92][0] = ephyrGLXGetFBConfigsSGIX; + dispatch_functions[92][1] = ephyrGLXGetFBConfigsSGIXSwap; + EPHYR_LOG ("hijacked glx entry points to forward requests to host X\n") ; return TRUE ; } @@ -114,6 +126,8 @@ ephyrGLXQueryVersion(__GLXclientState *a_cl, GLbyte *a_pc) EPHYR_LOG_ERROR ("ephyrHostGLXQueryVersion() failed\n") ; goto out ; } + EPHYR_LOG ("major:%d, minor:%d\n", + major, minor); reply.majorVersion = major ; reply.minorVersion = minor ; reply.length = 0 ; @@ -145,7 +159,9 @@ ephyrGLXQueryVersionSwap (__GLXclientState *a_cl, GLbyte *a_pc) } static int -ephyrGLXGetVisualConfigsReal (__GLXclientState *a_cl, GLbyte *a_pc, Bool a_do_swap) +ephyrGLXGetVisualConfigsReal (__GLXclientState *a_cl, + GLbyte *a_pc, + Bool a_do_swap) { xGLXGetVisualConfigsReq *req = (xGLXGetVisualConfigsReq *) a_pc; ClientPtr client = a_cl->client; @@ -200,6 +216,64 @@ out: return res ; } +static int +ephyrGLXGetFBConfigsSGIXReal (__GLXclientState *a_cl, + GLbyte *a_pc, + Bool a_do_swap) +{ + xGLXGetFBConfigsSGIXReq *req = (xGLXGetFBConfigsSGIXReq *)a_pc; + ClientPtr client = a_cl->client; + xGLXGetVisualConfigsReply reply; + int32_t *props_buf=NULL, num_visuals=0, + num_props=0, res=BadImplementation, i=0, + props_per_visual_size=0, + props_buf_size=0; + __GLX_DECLARE_SWAP_VARIABLES; + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; + + EPHYR_LOG ("enter\n") ; + + if (!ephyrHostGLXVendorPrivGetFBConfigsSGIX (req->screen, + &num_visuals, + &num_props, + &props_buf_size, + &props_buf)) { + EPHYR_LOG_ERROR ("ephyrHostGLXGetVisualConfigs() failed\n") ; + goto out ; + } + EPHYR_LOG ("num_visuals:%d, num_props:%d\n", num_visuals, num_props) ; + + reply.numVisuals = num_visuals; + reply.numProps = num_props; + reply.length = props_buf_size >> 2; + reply.type = X_Reply; + reply.sequenceNumber = client->sequence; + + if (a_do_swap) { + __GLX_SWAP_SHORT(&reply.sequenceNumber); + __GLX_SWAP_INT(&reply.length); + __GLX_SWAP_INT(&reply.numVisuals); + __GLX_SWAP_INT(&reply.numProps); + __GLX_SWAP_INT_ARRAY (props_buf, num_props) ; + } + WriteToClient(client, sz_xGLXGetVisualConfigsReply, (char*)&reply); + props_per_visual_size = props_buf_size/num_visuals ; + for (i=0; i < num_visuals; i++) { + WriteToClient (client, + props_per_visual_size, + &((char*)props_buf)[i*props_per_visual_size]); + } + res = Success ; + +out: + EPHYR_LOG ("leave\n") ; + if (props_buf) { + xfree (props_buf) ; + props_buf = NULL ; + } + return res ; +} + int ephyrGLXGetVisualConfigs (__GLXclientState *a_cl, GLbyte *a_pc) { @@ -256,10 +330,13 @@ ephyrGLXQueryServerString(__GLXclientState *a_cl, GLbyte *a_pc) int length=0 ; EPHYR_LOG ("enter\n") ; - if (!ephyrHostGLXGetStringFromServer (req->screen, req->name, &server_string)) { + if (!ephyrHostGLXGetStringFromServer (req->screen, + req->name, + &server_string)) { EPHYR_LOG_ERROR ("failed to query string from host\n") ; goto out ; } + EPHYR_LOG ("string: %s", server_string) ; length= strlen (server_string) + 1; reply.type = X_Reply ; reply.sequenceNumber = client->sequence ; @@ -287,5 +364,18 @@ ephyrGLXQueryServerStringSwap(__GLXclientState *a_cl, GLbyte *a_pc) return BadImplementation ; } + +int +ephyrGLXGetFBConfigsSGIX (__GLXclientState *a_cl, GLbyte *a_pc) +{ + return ephyrGLXGetFBConfigsSGIXReal (a_cl, a_pc, FALSE) ; +} + +int +ephyrGLXGetFBConfigsSGIXSwap (__GLXclientState *a_cl, GLbyte *a_pc) +{ + return ephyrGLXGetFBConfigsSGIXReal (a_cl, a_pc, TRUE) ; +} + #endif /*XEPHYR_DRI*/ diff --git a/hw/kdrive/ephyr/ephyrhostglx.c b/hw/kdrive/ephyr/ephyrhostglx.c index 693fbc1a9..83e06a85b 100644 --- a/hw/kdrive/ephyr/ephyrhostglx.c +++ b/hw/kdrive/ephyr/ephyrhostglx.c @@ -42,7 +42,20 @@ #include "ephyrlog.h" #ifdef XEPHYR_DRI +enum VisualConfRequestType { + EPHYR_GET_FB_CONFIG, + EPHYR_VENDOR_PRIV_GET_FB_CONFIG_SGIX, + EPHYR_GET_VISUAL_CONFIGS +}; + +static Bool ephyrHostGLXGetVisualConfigsInternal + (enum VisualConfRequestType a_type, + int32_t a_screen, + int32_t *a_num_visuals, + int32_t *a_num_props, + int32_t *a_props_buf_size, + int32_t **a_props_buf); Bool ephyrHostGLXGetMajorOpcode (int *a_opcode) { @@ -163,12 +176,13 @@ ephyrHostGLXGetStringFromServer (int a_screen_number, return TRUE ; } -Bool -ephyrHostGLXGetVisualConfigs (int32_t a_screen, - int32_t *a_num_visuals, - int32_t *a_num_props, - int32_t *a_props_buf_size, - int32_t **a_props_buf) +static Bool +ephyrHostGLXGetVisualConfigsInternal (enum VisualConfRequestType a_type, + int32_t a_screen, + int32_t *a_num_visuals, + int32_t *a_num_props, + int32_t *a_props_buf_size, + int32_t **a_props_buf) { Bool is_ok = FALSE ; Display *dpy = hostx_get_display () ; @@ -177,7 +191,6 @@ ephyrHostGLXGetVisualConfigs (int32_t a_screen, xGLXVendorPrivateWithReplyReq *vpreq; xGLXGetFBConfigsSGIXReq *sgi_req; xGLXGetVisualConfigsReply reply; - unsigned supported_request=0; char *server_glx_version=NULL, *server_glx_extensions=NULL ; int j=0, @@ -196,44 +209,22 @@ ephyrHostGLXGetVisualConfigs (int32_t a_screen, EPHYR_LOG_ERROR ("failed to get opcode\n") ; goto out ; } - if (!ephyrHostGLXGetStringFromServer (0, GLX_VERSION, - &server_glx_version) - || !server_glx_version) { - EPHYR_LOG_ERROR ("failed to get glx version from server\n") ; - goto out ; - } - - if (atof (server_glx_version) >= 1.3 ) { - supported_request = 1; - } - - if (!ephyrHostGLXGetStringFromServer (a_screen, GLX_EXTENSIONS, - &server_glx_extensions)) { - EPHYR_LOG_ERROR ("failed to get glx extensions from server for screen: %d\n", - a_screen) ; - goto out ; - } - if (supported_request != 1) { - if (server_glx_extensions - && strstr (server_glx_extensions, "GLX_SGIX_fbconfig" ) != NULL ) { - supported_request = 2; - } else { - supported_request = 3; - } - } LockDisplay(dpy); - switch (supported_request) { - case 1: + switch (a_type) { + case EPHYR_GET_FB_CONFIG: GetReq(GLXGetFBConfigs,fb_req); fb_req->reqType = major_opcode; fb_req->glxCode = X_GLXGetFBConfigs; fb_req->screen = a_screen; break; - case 2: + case EPHYR_VENDOR_PRIV_GET_FB_CONFIG_SGIX: GetReqExtra(GLXVendorPrivateWithReply, - sz_xGLXGetFBConfigsSGIXReq-sz_xGLXVendorPrivateWithReplyReq,vpreq); + sz_xGLXGetFBConfigsSGIXReq + - + sz_xGLXVendorPrivateWithReplyReq, + vpreq); sgi_req = (xGLXGetFBConfigsSGIXReq *) vpreq; sgi_req->reqType = major_opcode; sgi_req->glxCode = X_GLXVendorPrivateWithReply; @@ -241,7 +232,7 @@ ephyrHostGLXGetVisualConfigs (int32_t a_screen, sgi_req->screen = a_screen; break; - case 3: + case EPHYR_GET_VISUAL_CONFIGS: GetReq(GLXGetVisualConfigs,req); req->reqType = major_opcode; req->glxCode = X_GLXGetVisualConfigs; @@ -274,7 +265,7 @@ ephyrHostGLXGetVisualConfigs (int32_t a_screen, goto out ; } - if (supported_request != 3) { + if (a_type != EPHYR_GET_VISUAL_CONFIGS) { num_props *= 2; } props_per_visual_size = num_props * __GLX_SIZE_INT32; @@ -282,7 +273,7 @@ ephyrHostGLXGetVisualConfigs (int32_t a_screen, props_buf = malloc (props_buf_size) ; for (j = 0; j < reply.numVisuals; j++) { if (_XRead (dpy, - (char*)props_buf + j*props_per_visual_size, + &((char*)props_buf)[j*props_per_visual_size], props_per_visual_size) != Success) { EPHYR_LOG_ERROR ("read failed\n") ; } @@ -290,7 +281,7 @@ ephyrHostGLXGetVisualConfigs (int32_t a_screen, UnlockDisplay(dpy); *a_num_visuals = num_visuals ; - *a_num_props = num_props ; + *a_num_props = reply.numProps ; *a_props_buf_size = props_buf_size ; *a_props_buf = props_buf ; is_ok = TRUE ; @@ -308,6 +299,47 @@ out: return is_ok; } +Bool +ephyrHostGLXGetVisualConfigs (int32_t a_screen, + int32_t *a_num_visuals, + int32_t *a_num_props, + int32_t *a_props_buf_size, + int32_t **a_props_buf) +{ + Bool is_ok = FALSE; + + EPHYR_LOG ("enter\n") ; + is_ok = ephyrHostGLXGetVisualConfigsInternal (EPHYR_GET_VISUAL_CONFIGS, + a_screen, + a_num_visuals, + a_num_props, + a_props_buf_size, + a_props_buf) ; + + EPHYR_LOG ("leave:%d\n", is_ok) ; + return is_ok; +} + +Bool +ephyrHostGLXVendorPrivGetFBConfigsSGIX (int a_screen, + int32_t *a_num_visuals, + int32_t *a_num_props, + int32_t *a_props_buf_size, + int32_t **a_props_buf) +{ + Bool is_ok=FALSE ; + EPHYR_LOG ("enter\n") ; + is_ok = ephyrHostGLXGetVisualConfigsInternal + (EPHYR_VENDOR_PRIV_GET_FB_CONFIG_SGIX, + a_screen, + a_num_visuals, + a_num_props, + a_props_buf_size, + a_props_buf) ; + EPHYR_LOG ("leave\n") ; + return is_ok ; +} + Bool ephyrHostGLXSendClientInfo (int32_t a_major, int32_t a_minor, const char* a_extension_list) diff --git a/hw/kdrive/ephyr/ephyrhostglx.h b/hw/kdrive/ephyr/ephyrhostglx.h index 7a158f3d0..1040f6c61 100644 --- a/hw/kdrive/ephyr/ephyrhostglx.h +++ b/hw/kdrive/ephyr/ephyrhostglx.h @@ -37,9 +37,13 @@ Bool ephyrHostGLXGetVisualConfigs (int a_screen, int32_t *a_num_props, int32_t *a_props_buf_size, int32_t **a_props_buf) ; - +Bool +ephyrHostGLXVendorPrivGetFBConfigsSGIX (int a_screen, + int32_t *a_num_visuals, + int32_t *a_num_props, + int32_t *a_props_buf_size, + int32_t **a_props_buf); Bool ephyrHostGLXGetMajorOpcode (int32_t *a_opcode) ; - Bool ephyrHostGLXSendClientInfo (int32_t a_major, int32_t a_minor, const char* a_extension_list) ;