2
* Copyright © 2013 Intel Corporation
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:
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
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.
23
#include <gtest/gtest.h>
27
#include "glxclient.h"
28
#include "glx_error.h"
30
extern bool GetGLXScreenConfigs_called;
31
extern struct glx_screen *psc;
33
struct attribute_test_vector {
38
#define E(x) { # x, x }
42
static bool got_sigsegv;
46
sigsegv_handler(int sig)
53
static bool query_renderer_string_called = false;
54
static bool query_renderer_integer_called = false;
57
fake_query_renderer_integer(struct glx_screen *psc, int attribute,
64
query_renderer_integer_called = true;
70
fake_query_renderer_string(struct glx_screen *psc, int attribute,
77
query_renderer_string_called = true;
82
struct glx_screen_vtable fake_vtable = {
85
fake_query_renderer_integer,
86
fake_query_renderer_string
89
class query_renderer_string_test : public ::testing::Test {
92
virtual void TearDown();
94
struct glx_screen scr;
96
struct sigaction old_sa;
100
class query_renderer_integer_test : public query_renderer_string_test {
103
void query_renderer_string_test::SetUp()
105
memset(&scr, 0, sizeof(scr));
106
scr.vtable = &fake_vtable;
111
sa.sa_handler = sigsegv_handler;
112
sigemptyset(&sa.sa_mask);
114
sigaction(SIGSEGV, &sa, &old_sa);
117
void query_renderer_string_test::TearDown()
119
sigaction(SIGSEGV, &old_sa, NULL);
123
* glXQueryRendererStringMESA will return \c NULL if the query_render_string
124
* vtable entry is \c NULL. It will also not segfault.
126
TEST_F(query_renderer_string_test, null_query_render_string)
128
struct glx_screen_vtable vtable = {
135
scr.vtable = &vtable;
137
if (setjmp(jmp) == 0) {
139
glXQueryRendererStringMESA(&dpy, 0, 0, GLX_RENDERER_VENDOR_ID_MESA);
140
EXPECT_EQ((char *)0, str);
142
EXPECT_FALSE(got_sigsegv);
147
* glXQueryRendererStringMESA will not call the screen query_render_string
148
* function with an invalid GLX enum value, and it will return NULL.
150
TEST_F(query_renderer_string_test, invalid_attribute)
152
static const attribute_test_vector invalid_attributes[] = {
153
/* These values are just plain invalid for use with this extension.
159
E(GLX_RENDERER_VENDOR_ID_MESA + 0x10000),
160
E(GLX_RENDERER_DEVICE_ID_MESA + 0x10000),
162
/* These enums are part of the extension, but they are not allowed for
165
E(GLX_RENDERER_VERSION_MESA),
166
E(GLX_RENDERER_ACCELERATED_MESA),
167
E(GLX_RENDERER_VIDEO_MEMORY_MESA),
168
E(GLX_RENDERER_UNIFIED_MEMORY_ARCHITECTURE_MESA),
169
E(GLX_RENDERER_PREFERRED_PROFILE_MESA),
170
E(GLX_RENDERER_OPENGL_CORE_PROFILE_VERSION_MESA),
171
E(GLX_RENDERER_OPENGL_COMPATIBILITY_PROFILE_VERSION_MESA),
172
E(GLX_RENDERER_OPENGL_ES_PROFILE_VERSION_MESA),
173
E(GLX_RENDERER_OPENGL_ES2_PROFILE_VERSION_MESA),
176
for (unsigned i = 0; i < ARRAY_SIZE(invalid_attributes); i++) {
177
query_renderer_integer_called = false;
178
query_renderer_string_called = false;
181
glXQueryRendererStringMESA(&dpy, 0, 0, invalid_attributes[i].value);
182
EXPECT_EQ((char *)0, str) << invalid_attributes[i].string;
183
EXPECT_FALSE(query_renderer_integer_called)
184
<< invalid_attributes[i].string;
185
EXPECT_FALSE(query_renderer_string_called)
186
<< invalid_attributes[i].string;
191
* glXQueryRendererStringMESA will not call GetGLXScreenConfigs if the display
192
* pointer is \c NULL. It will also not segfault.
194
TEST_F(query_renderer_string_test, null_display_pointer)
196
if (setjmp(jmp) == 0) {
197
GetGLXScreenConfigs_called = false;
200
glXQueryRendererStringMESA(NULL, 0, 0, GLX_RENDERER_VENDOR_ID_MESA);
201
EXPECT_EQ((char *)0, str);
202
EXPECT_FALSE(GetGLXScreenConfigs_called);
204
EXPECT_FALSE(got_sigsegv);
209
* glXQueryRendererStringMESA will return error if GetGLXScreenConfigs returns
210
* NULL. It will also not segfault.
212
TEST_F(query_renderer_string_test, null_screen_pointer)
216
if (setjmp(jmp) == 0) {
217
GetGLXScreenConfigs_called = false;
220
glXQueryRendererStringMESA(&dpy, 0, 0, GLX_RENDERER_VENDOR_ID_MESA);
221
EXPECT_EQ((char *)0, str);
222
EXPECT_TRUE(GetGLXScreenConfigs_called);
224
EXPECT_FALSE(got_sigsegv);
229
* glXQueryRendererStringMESA will not call the screen query_render_string
230
* function if the renderer is invalid, and it will return NULL.
232
TEST_F(query_renderer_string_test, invalid_renderer_index)
234
static const int invalid_renderer_indices[] = {
240
if (setjmp(jmp) == 0) {
241
for (unsigned i = 0; i < ARRAY_SIZE(invalid_renderer_indices); i++) {
243
glXQueryRendererStringMESA(&dpy, 0,
244
invalid_renderer_indices[i],
245
GLX_RENDERER_VENDOR_ID_MESA);
246
EXPECT_EQ((char *)0, str) << invalid_renderer_indices[i];
247
EXPECT_FALSE(query_renderer_integer_called)
248
<< invalid_renderer_indices[i];
249
EXPECT_FALSE(query_renderer_string_called)
250
<< invalid_renderer_indices[i];
253
EXPECT_FALSE(got_sigsegv);
258
* glXQueryCurrentRendererStringMESA will return error if there is no context
259
* current. It will also not segfault.
261
TEST_F(query_renderer_string_test, no_current_context)
263
if (setjmp(jmp) == 0) {
265
glXQueryCurrentRendererStringMESA(GLX_RENDERER_VENDOR_ID_MESA);
266
EXPECT_EQ((char *)0, str);
268
EXPECT_FALSE(got_sigsegv);
273
* glXQueryCurrentRendererIntegerMESA will return \c NULL if the
274
* query_render_string vtable entry is \c NULL. It will also not segfault.
276
TEST_F(query_renderer_integer_test, null_query_render_string)
278
struct glx_screen_vtable vtable = {
285
scr.vtable = &vtable;
287
if (setjmp(jmp) == 0) {
288
unsigned value = 0xDEADBEEF;
289
Bool success = glXQueryRendererIntegerMESA(&dpy, 0, 0,
290
GLX_RENDERER_VENDOR_ID_MESA,
292
EXPECT_FALSE(success);
293
EXPECT_EQ(0xDEADBEEF, value);
295
EXPECT_FALSE(got_sigsegv);
300
* glXQueryCurrentRendererIntegerMESA will not call the screen
301
* query_render_string function with an invalid GLX enum value, and it will
304
TEST_F(query_renderer_integer_test, invalid_attribute)
306
static const attribute_test_vector invalid_attributes[] = {
307
/* These values are just plain invalid for use with this extension.
313
E(GLX_RENDERER_VENDOR_ID_MESA + 0x10000),
314
E(GLX_RENDERER_DEVICE_ID_MESA + 0x10000),
315
E(GLX_RENDERER_VERSION_MESA + 0x10000),
316
E(GLX_RENDERER_ACCELERATED_MESA + 0x10000),
317
E(GLX_RENDERER_VIDEO_MEMORY_MESA + 0x10000),
318
E(GLX_RENDERER_UNIFIED_MEMORY_ARCHITECTURE_MESA + 0x10000),
319
E(GLX_RENDERER_PREFERRED_PROFILE_MESA + 0x10000),
320
E(GLX_RENDERER_OPENGL_CORE_PROFILE_VERSION_MESA + 0x10000),
321
E(GLX_RENDERER_OPENGL_COMPATIBILITY_PROFILE_VERSION_MESA + 0x10000),
322
E(GLX_RENDERER_OPENGL_ES_PROFILE_VERSION_MESA + 0x10000),
323
E(GLX_RENDERER_OPENGL_ES2_PROFILE_VERSION_MESA + 0x10000),
326
for (unsigned i = 0; i < ARRAY_SIZE(invalid_attributes); i++) {
327
query_renderer_integer_called = false;
328
query_renderer_string_called = false;
330
unsigned value = 0xDEADBEEF;
332
glXQueryRendererIntegerMESA(&dpy, 0, 0,
333
invalid_attributes[i].value,
335
EXPECT_FALSE(success) << invalid_attributes[i].string;
336
EXPECT_EQ(0xDEADBEEF, value) << invalid_attributes[i].string;
337
EXPECT_FALSE(query_renderer_integer_called)
338
<< invalid_attributes[i].string;
339
EXPECT_FALSE(query_renderer_string_called)
340
<< invalid_attributes[i].string;
345
* glXQueryCurrentRendererIntegerMESA will not call GetGLXScreenConfigs if the
346
* display pointer is \c NULL. It will also not segfault.
348
TEST_F(query_renderer_integer_test, null_display_pointer)
350
if (setjmp(jmp) == 0) {
351
GetGLXScreenConfigs_called = false;
353
unsigned value = 0xDEADBEEF;
355
glXQueryRendererIntegerMESA(NULL, 0, 0, GLX_RENDERER_VENDOR_ID_MESA,
357
EXPECT_FALSE(success);
358
EXPECT_EQ(0xDEADBEEF, value);
359
EXPECT_FALSE(GetGLXScreenConfigs_called);
361
EXPECT_FALSE(got_sigsegv);
366
* glXQueryCurrentRendererIntegerMESA will return error if GetGLXScreenConfigs
367
* returns NULL. It will also not segfault.
369
TEST_F(query_renderer_integer_test, null_screen_pointer)
373
if (setjmp(jmp) == 0) {
374
GetGLXScreenConfigs_called = false;
376
unsigned value = 0xDEADBEEF;
378
glXQueryRendererIntegerMESA(&dpy, 0, 0, GLX_RENDERER_VENDOR_ID_MESA,
380
EXPECT_FALSE(success);
381
EXPECT_EQ(0xDEADBEEF, value);
382
EXPECT_TRUE(GetGLXScreenConfigs_called);
384
EXPECT_FALSE(got_sigsegv);
389
* glXQueryRendererIntegerMESA will not call the screen query_render_integer
390
* function if the renderer is invalid, and it will return NULL.
392
TEST_F(query_renderer_integer_test, invalid_renderer_index)
394
static const int invalid_renderer_indices[] = {
400
if (setjmp(jmp) == 0) {
401
for (unsigned i = 0; i < ARRAY_SIZE(invalid_renderer_indices); i++) {
402
unsigned value = 0xDEADBEEF;
404
glXQueryRendererIntegerMESA(&dpy, 0,
405
invalid_renderer_indices[i],
406
GLX_RENDERER_VENDOR_ID_MESA,
408
EXPECT_FALSE(success) << invalid_renderer_indices[i];
409
EXPECT_EQ(0xDEADBEEF, value) << invalid_renderer_indices[i];
410
EXPECT_FALSE(query_renderer_integer_called)
411
<< invalid_renderer_indices[i];
412
EXPECT_FALSE(query_renderer_string_called)
413
<< invalid_renderer_indices[i];
416
EXPECT_FALSE(got_sigsegv);
421
* glXQueryCurrentRendererIntegerMESA will return error if there is no context
422
* current. It will also not segfault.
424
TEST_F(query_renderer_integer_test, no_current_context)
426
if (setjmp(jmp) == 0) {
427
unsigned value = 0xDEADBEEF;
429
glXQueryCurrentRendererIntegerMESA(GLX_RENDERER_VENDOR_ID_MESA,
431
EXPECT_FALSE(success);
432
EXPECT_EQ(0xDEADBEEF, value);
434
EXPECT_FALSE(got_sigsegv);