diff options
author | Ian Romanick <[email protected]> | 2013-02-15 22:35:24 -0800 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2013-11-07 18:12:32 -0800 |
commit | 6c28c037c4840332828fddf911cf67daffa16a23 (patch) | |
tree | 69a17699dc5ca9814b7d54e2534e7a4c4b24923a /src/glx/query_renderer.c | |
parent | 38a1d8b14cb6db967c323c3437dc04fd1989b1f2 (diff) |
glx: Add functions and GLX plumbing for GLX_MESA_query_renderer
Signed-off-by: Ian Romanick <[email protected]>
Reviewed-by: Kenneth Graunke <[email protected]>
Diffstat (limited to 'src/glx/query_renderer.c')
-rw-r--r-- | src/glx/query_renderer.c | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/src/glx/query_renderer.c b/src/glx/query_renderer.c new file mode 100644 index 00000000000..981a844e94e --- /dev/null +++ b/src/glx/query_renderer.c @@ -0,0 +1,173 @@ +/* + * Copyright © 2013 Intel Corporation + * + * 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. + */ +#include "glxclient.h" +#include "glx_error.h" + +#include <assert.h> + +static Bool +__glXQueryRendererInteger(struct glx_screen *psc, int attribute, + unsigned int *value) +{ + unsigned int values_for_query = 0; + int buffer[32]; + int err; + + /* This probably means the caller is trying to use an extension function + * that isn't actually supported. + */ + if (psc->vtable->query_renderer_integer == NULL) + return False; + + switch (attribute) { + case GLX_RENDERER_VENDOR_ID_MESA: + case GLX_RENDERER_DEVICE_ID_MESA: + values_for_query = 1; + break; + case GLX_RENDERER_VERSION_MESA: + values_for_query = 3; + break; + case GLX_RENDERER_ACCELERATED_MESA: + case GLX_RENDERER_VIDEO_MEMORY_MESA: + case GLX_RENDERER_UNIFIED_MEMORY_ARCHITECTURE_MESA: + case GLX_RENDERER_PREFERRED_PROFILE_MESA: + values_for_query = 1; + break; + case GLX_RENDERER_OPENGL_CORE_PROFILE_VERSION_MESA: + case GLX_RENDERER_OPENGL_COMPATIBILITY_PROFILE_VERSION_MESA: + case GLX_RENDERER_OPENGL_ES_PROFILE_VERSION_MESA: + case GLX_RENDERER_OPENGL_ES2_PROFILE_VERSION_MESA: + values_for_query = 2; + break; + + default: + return False; + } + + err = psc->vtable->query_renderer_integer(psc, attribute, buffer); + + /* If there was no error, copy the correct number of values from the driver + * out to the application. + */ + if (err == 0) + memcpy(value, buffer, sizeof(unsigned int) * values_for_query); + + return err == 0; +} + +_X_HIDDEN Bool +glXQueryRendererIntegerMESA(Display *dpy, int screen, + int renderer, int attribute, + unsigned int *value) +{ + struct glx_screen *psc; + + if (dpy == NULL) + return False; + + /* This probably means the caller passed the wrong display pointer or + * screen number. + */ + psc = GetGLXScreenConfigs(dpy, screen); + if (psc == NULL) + return False; + + /* Right now only a single renderer per display / screen combination is + * supported. + */ + if (renderer != 0) + return False; + + return __glXQueryRendererInteger(psc, attribute, value); +} + +_X_HIDDEN Bool +glXQueryCurrentRendererIntegerMESA(int attribute, unsigned int *value) +{ + struct glx_context *gc = __glXGetCurrentContext(); + + if (gc == NULL) + return False; + + return __glXQueryRendererInteger(gc->psc, attribute, value); +} + +static const char * +__glXQueryRendererString(struct glx_screen *psc, int attribute) +{ + const char *value; + int err; + + /* This probably means the caller is trying to use an extension function + * that isn't actually supported. + */ + if (psc->vtable->query_renderer_integer == NULL) + return NULL; + + switch (attribute) { + case GLX_RENDERER_VENDOR_ID_MESA: + case GLX_RENDERER_DEVICE_ID_MESA: + break; + default: + return NULL; + } + + err = psc->vtable->query_renderer_string(psc, attribute, &value); + return (err == 0) ? value : NULL; +} + +_X_HIDDEN const char * +glXQueryRendererStringMESA(Display *dpy, int screen, + int renderer, int attribute) +{ + struct glx_screen *psc; + + if (dpy == NULL) + return False; + + /* This probably means the caller passed the wrong display pointer or + * screen number. + */ + psc = GetGLXScreenConfigs(dpy, screen); + if (psc == NULL) + return False; + + /* Right now only a single renderer per display / screen combination is + * supported. + */ + if (renderer != 0) + return False; + + return __glXQueryRendererString(psc, attribute); +} + +_X_HIDDEN const char * +glXQueryCurrentRendererStringMESA(int attribute) +{ + struct glx_context *gc = __glXGetCurrentContext(); + + if (gc == NULL) + return False; + + return __glXQueryRendererString(gc->psc, attribute); +} |