xref: /third_party/mesa3d/src/glx/query_renderer.c (revision bf215546)
1/*
2 * Copyright © 2013 Intel Corporation
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
21 * DEALINGS IN THE SOFTWARE.
22 */
23#include "glxclient.h"
24#include "glx_error.h"
25
26#include <assert.h>
27
28static Bool
29__glXQueryRendererInteger(struct glx_screen *psc, int attribute,
30                          unsigned int *value)
31{
32   unsigned int values_for_query = 0;
33   unsigned int buffer[32];
34   int err;
35
36   /* This probably means the caller is trying to use an extension function
37    * that isn't actually supported.
38    */
39   if (psc->vtable->query_renderer_integer == NULL)
40      return False;
41
42   switch (attribute) {
43   case GLX_RENDERER_VENDOR_ID_MESA:
44   case GLX_RENDERER_DEVICE_ID_MESA:
45      values_for_query = 1;
46      break;
47   case GLX_RENDERER_VERSION_MESA:
48      values_for_query = 3;
49      break;
50   case GLX_RENDERER_ACCELERATED_MESA:
51   case GLX_RENDERER_VIDEO_MEMORY_MESA:
52   case GLX_RENDERER_UNIFIED_MEMORY_ARCHITECTURE_MESA:
53   case GLX_RENDERER_PREFERRED_PROFILE_MESA:
54      values_for_query = 1;
55      break;
56   case GLX_RENDERER_OPENGL_CORE_PROFILE_VERSION_MESA:
57   case GLX_RENDERER_OPENGL_COMPATIBILITY_PROFILE_VERSION_MESA:
58   case GLX_RENDERER_OPENGL_ES_PROFILE_VERSION_MESA:
59   case GLX_RENDERER_OPENGL_ES2_PROFILE_VERSION_MESA:
60      values_for_query = 2;
61      break;
62
63   default:
64      return False;
65   }
66
67   err = psc->vtable->query_renderer_integer(psc, attribute, buffer);
68
69   /* If there was no error, copy the correct number of values from the driver
70    * out to the application.
71    */
72   if (err == 0)
73      memcpy(value, buffer, sizeof(unsigned int) * values_for_query);
74
75   return err == 0;
76}
77
78_X_HIDDEN Bool
79glXQueryRendererIntegerMESA(Display *dpy, int screen,
80                            int renderer, int attribute,
81                            unsigned int *value)
82{
83   struct glx_screen *psc;
84
85   if (dpy == NULL)
86      return False;
87
88   /* This probably means the caller passed the wrong display pointer or
89    * screen number.
90    */
91   psc = GetGLXScreenConfigs(dpy, screen);
92   if (psc == NULL)
93      return False;
94
95   /* Right now only a single renderer per display / screen combination is
96    * supported.
97    */
98   if (renderer != 0)
99      return False;
100
101   return __glXQueryRendererInteger(psc, attribute, value);
102}
103
104_X_HIDDEN Bool
105glXQueryCurrentRendererIntegerMESA(int attribute, unsigned int *value)
106{
107   struct glx_context *gc = __glXGetCurrentContext();
108
109   if (gc == &dummyContext)
110      return False;
111
112   return __glXQueryRendererInteger(gc->psc, attribute, value);
113}
114
115static const char *
116__glXQueryRendererString(struct glx_screen *psc, int attribute)
117{
118   const char *value;
119   int err;
120
121   /* This probably means the caller is trying to use an extension function
122    * that isn't actually supported.
123    */
124   if (psc->vtable->query_renderer_integer == NULL)
125      return NULL;
126
127   switch (attribute) {
128   case GLX_RENDERER_VENDOR_ID_MESA:
129   case GLX_RENDERER_DEVICE_ID_MESA:
130      break;
131   default:
132      return NULL;
133   }
134
135   err = psc->vtable->query_renderer_string(psc, attribute, &value);
136   return (err == 0) ? value : NULL;
137}
138
139_X_HIDDEN const char *
140glXQueryRendererStringMESA(Display *dpy, int screen,
141                           int renderer, int attribute)
142{
143   struct glx_screen *psc;
144
145   if (dpy == NULL)
146      return NULL;
147
148   /* This probably means the caller passed the wrong display pointer or
149    * screen number.
150    */
151   psc = GetGLXScreenConfigs(dpy, screen);
152   if (psc == NULL)
153      return NULL;
154
155   /* Right now only a single renderer per display / screen combination is
156    * supported.
157    */
158   if (renderer != 0)
159      return NULL;
160
161   return __glXQueryRendererString(psc, attribute);
162}
163
164_X_HIDDEN const char *
165glXQueryCurrentRendererStringMESA(int attribute)
166{
167   struct glx_context *gc = __glXGetCurrentContext();
168
169   if (gc == &dummyContext)
170      return NULL;
171
172   return __glXQueryRendererString(gc->psc, attribute);
173}
174