1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright © 2011 Intel Corporation
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"),
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions:
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the next
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * paragraph) shall be included in all copies or substantial portions of the
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software.
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DEALINGS IN THE SOFTWARE.
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <gtest/gtest.h>
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <string.h>
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern "C" {
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glxclient.h"
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <xcb/glx.h>
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "mock_xdisplay.h"
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "fake_glx_screen.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \name Wrappers around some X structures to make the more usable for tests
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*@{*/
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass fake_glx_screen;
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass fake_glx_display : public glx_display {
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic:
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fake_glx_display(mock_XDisplay *dpy, int major, int minor)
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      this->next = 0;
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      this->dpy = dpy;
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      this->majorOpcode = 0;
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      this->majorVersion = major;
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      this->minorVersion = minor;
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      this->serverGLXvendor = 0;
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      this->serverGLXversion = 0;
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      this->glXDrawHash = 0;
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      this->screens = new glx_screen *[dpy->nscreens];
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memset(this->screens, 0, sizeof(struct glx_screen *) * dpy->nscreens);
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ~fake_glx_display()
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (int i = 0; i < this->dpy->nscreens; i++) {
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (this->screens[i] != NULL)
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    delete this->screens[i];
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      delete [] this->screens;
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void init_screen(int i, const char *ext);
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass glX_send_client_info_test : public ::testing::Test {
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic:
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glX_send_client_info_test();
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   virtual ~glX_send_client_info_test();
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   virtual void SetUp();
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void common_protocol_expected_false_test(unsigned major, unsigned minor,
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					    const char *glx_ext, bool *value);
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void common_protocol_expected_true_test(unsigned major, unsigned minor,
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					   const char *glx_ext, bool *value);
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void create_single_screen_display(unsigned major, unsigned minor,
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				     const char *glx_ext);
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void destroy_display();
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprotected:
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fake_glx_display *glx_dpy;
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mock_XDisplay *display;
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgfake_glx_display::init_screen(int i, const char *ext)
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (this->screens[i] != NULL)
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      delete this->screens[i];
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   this->screens[i] = new fake_glx_screen(this, i, ext);
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*@}*/
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const char ext[] = "GL_XXX_dummy";
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic bool ClientInfo_was_sent;
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic bool SetClientInfoARB_was_sent;
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic bool SetClientInfo2ARB_was_sent;
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic xcb_connection_t *connection_used;
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int gl_ext_length;
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic char *gl_ext_string;
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int glx_ext_length;
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic char *glx_ext_string;
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int num_gl_versions;
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint32_t *gl_versions;
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int glx_major;
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int glx_minor;
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern "C" xcb_connection_t *
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXGetXCBConnection(Display *dpy)
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (xcb_connection_t *) 0xdeadbeef;
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern "C" xcb_void_cookie_t
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxcb_glx_client_info(xcb_connection_t *c,
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    uint32_t major_version,
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    uint32_t minor_version,
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    uint32_t str_len,
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    const char *string)
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   xcb_void_cookie_t cookie;
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ClientInfo_was_sent = true;
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   connection_used = c;
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   gl_ext_string = (char *) malloc(str_len);
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memcpy(gl_ext_string, string, str_len);
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   gl_ext_length = str_len;
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx_major = major_version;
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx_minor = minor_version;
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cookie.sequence = 0;
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return cookie;
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern "C" xcb_void_cookie_t
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxcb_glx_set_client_info_arb(xcb_connection_t *c,
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    uint32_t major_version,
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    uint32_t minor_version,
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    uint32_t num_versions,
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    uint32_t gl_str_len,
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    uint32_t glx_str_len,
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    const uint32_t *versions,
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    const char *gl_string,
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    const char *glx_string)
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   xcb_void_cookie_t cookie;
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SetClientInfoARB_was_sent = true;
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   connection_used = c;
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   gl_ext_string = new char[gl_str_len];
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memcpy(gl_ext_string, gl_string, gl_str_len);
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   gl_ext_length = gl_str_len;
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx_ext_string = new char[glx_str_len];
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memcpy(glx_ext_string, glx_string, glx_str_len);
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx_ext_length = glx_str_len;
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   gl_versions = new uint32_t[num_versions * 2];
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memcpy(gl_versions, versions, sizeof(uint32_t) * num_versions * 2);
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   num_gl_versions = num_versions;
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx_major = major_version;
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx_minor = minor_version;
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cookie.sequence = 0;
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return cookie;
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern "C" xcb_void_cookie_t
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxcb_glx_set_client_info_2arb(xcb_connection_t *c,
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     uint32_t major_version,
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     uint32_t minor_version,
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     uint32_t num_versions,
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     uint32_t gl_str_len,
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     uint32_t glx_str_len,
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     const uint32_t *versions,
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     const char *gl_string,
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     const char *glx_string)
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   xcb_void_cookie_t cookie;
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SetClientInfo2ARB_was_sent = true;
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   connection_used = c;
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   gl_ext_string = new char[gl_str_len];
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memcpy(gl_ext_string, gl_string, gl_str_len);
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   gl_ext_length = gl_str_len;
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx_ext_string = new char[glx_str_len];
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memcpy(glx_ext_string, glx_string, glx_str_len);
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx_ext_length = glx_str_len;
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   gl_versions = new uint32_t[num_versions * 3];
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memcpy(gl_versions, versions, sizeof(uint32_t) * num_versions * 3);
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   num_gl_versions = num_versions;
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx_major = major_version;
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx_minor = minor_version;
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cookie.sequence = 0;
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return cookie;
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern "C" char *
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org__glXGetClientGLExtensionString()
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   char *str = (char *) malloc(sizeof(ext));
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memcpy(str, ext, sizeof(ext));
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return str;
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgglX_send_client_info_test::glX_send_client_info_test()
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   : glx_dpy(0), display(0)
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* empty */
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgglX_send_client_info_test::~glX_send_client_info_test()
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (glx_dpy)
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      delete glx_dpy;
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (display)
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      delete display;
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgglX_send_client_info_test::destroy_display()
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (this->glx_dpy != NULL) {
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (this->glx_dpy->screens != NULL) {
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 for (int i = 0; i < this->display->nscreens; i++) {
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    delete [] this->glx_dpy->screens[i]->serverGLXexts;
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    delete this->glx_dpy->screens[i];
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 delete [] this->glx_dpy->screens;
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      delete this->glx_dpy;
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      delete this->display;
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgglX_send_client_info_test::SetUp()
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ClientInfo_was_sent = false;
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SetClientInfoARB_was_sent = false;
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SetClientInfo2ARB_was_sent = false;
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   connection_used = (xcb_connection_t *) ~0;
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   gl_ext_length = 0;
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   gl_ext_string = (char *) 0;
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx_ext_length = 0;
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx_ext_string = (char *) 0;
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   num_gl_versions = 0;
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   gl_versions = (uint32_t *) 0;
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx_major = 0;
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx_minor = 0;
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgglX_send_client_info_test::create_single_screen_display(unsigned major,
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org							unsigned minor,
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org							const char *glx_ext)
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   this->display = new mock_XDisplay(1);
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   this->glx_dpy = new fake_glx_display(this->display, major, minor);
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   this->glx_dpy->init_screen(0, glx_ext);
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgglX_send_client_info_test::common_protocol_expected_false_test(unsigned major,
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org							       unsigned minor,
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org							       const char *glx_ext,
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org							       bool *value)
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   create_single_screen_display(major, minor, glx_ext);
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __glX_send_client_info(this->glx_dpy);
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EXPECT_FALSE(*value);
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgglX_send_client_info_test::common_protocol_expected_true_test(unsigned major,
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org							      unsigned minor,
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org							      const char *glx_ext,
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org							      bool *value)
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   create_single_screen_display(major, minor, glx_ext);
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __glX_send_client_info(this->glx_dpy);
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EXPECT_TRUE(*value);
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTEST_F(glX_send_client_info_test, doesnt_send_ClientInfo_for_1_0)
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* The glXClientInfo protocol was added in GLX 1.1.  Verify that no
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * glXClientInfo is sent to a GLX server that only has GLX 1.0.
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   common_protocol_expected_false_test(1, 0, "", &ClientInfo_was_sent);
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTEST_F(glX_send_client_info_test, doesnt_send_SetClientInfoARB_for_1_0)
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* The glXSetClientInfoARB protocol was added in GLX 1.4 with the
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * GLX_ARB_create_context extension.  Verify that no glXSetClientInfoARB is
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * sent to a GLX server that only has GLX 1.0 regardless of the extension
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * setting.
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   common_protocol_expected_false_test(1, 0,
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       "GLX_ARB_create_context",
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       &SetClientInfoARB_was_sent);
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTEST_F(glX_send_client_info_test, doesnt_send_SetClientInfoARB_for_1_1)
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* The glXSetClientInfoARB protocol was added in GLX 1.4 with the
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * GLX_ARB_create_context extension.  Verify that no glXSetClientInfoARB is
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * sent to a GLX server that only has GLX 1.0 regardless of the extension
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * setting.
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   common_protocol_expected_false_test(1, 1,
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       "GLX_ARB_create_context",
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       &SetClientInfoARB_was_sent);
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTEST_F(glX_send_client_info_test, doesnt_send_SetClientInfoARB_for_1_4_with_empty_extensions)
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* The glXSetClientInfoARB protocol was added in GLX 1.4 with the
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * GLX_ARB_create_context extension.  Verify that no glXSetClientInfoARB is
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * sent to a GLX server that has GLX 1.4 but has an empty extension string
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * (i.e., no extensions at all).
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   common_protocol_expected_false_test(1, 4,
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       "",
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       &SetClientInfoARB_was_sent);
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTEST_F(glX_send_client_info_test, doesnt_send_SetClientInfoARB_for_1_4_without_extension)
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* The glXSetClientInfoARB protocol was added in GLX 1.4 with the
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * GLX_ARB_create_context extension.  Verify that no glXSetClientInfoARB is
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * sent to a GLX server that has GLX 1.4 but doesn't have the extension.
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   common_protocol_expected_false_test(1, 4,
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       "GLX_EXT_texture_from_pixmap",
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       &SetClientInfoARB_was_sent);
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTEST_F(glX_send_client_info_test, doesnt_send_SetClientInfoARB_for_1_4_with_wrong_extension)
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* The glXSetClientInfoARB protocol was added in GLX 1.4 with the
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * GLX_ARB_create_context extension.  Verify that no glXSetClientInfoARB is
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * sent to a GLX server that has GLX 1.4 but does not have the extension.
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * This test differs from
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * doesnt_send_SetClientInfoARB_for_1_4_without_extension in that an
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * extension exists that looks like the correct extension but isn't.
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   common_protocol_expected_false_test(1, 4,
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       "GLX_ARB_create_context2",
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       &SetClientInfoARB_was_sent);
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTEST_F(glX_send_client_info_test, doesnt_send_SetClientInfoARB_for_1_4_with_profile_extension)
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* The glXSetClientInfoARB protocol was added in GLX 1.4 with the
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * GLX_ARB_create_context extension.  Verify that no glXSetClientInfoARB is
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * sent to a GLX server that has GLX 1.4 but does not have the extension.
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * This test differs from
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * doesnt_send_SetClientInfoARB_for_1_4_without_extension in that an
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * extension exists that looks like the correct extension but isn't.
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   common_protocol_expected_false_test(1, 4,
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       "GLX_ARB_create_context_profile",
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       &SetClientInfoARB_was_sent);
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTEST_F(glX_send_client_info_test, doesnt_send_SetClientInfo2ARB_for_1_0)
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* The glXSetClientInfo2ARB protocol was added in GLX 1.4 with the
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * GLX_ARB_create_context_profile extension.  Verify that no
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * glXSetClientInfo2ARB is sent to a GLX server that only has GLX 1.0
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * regardless of the extension setting.
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   common_protocol_expected_false_test(1, 0,
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       "GLX_ARB_create_context_profile",
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       &SetClientInfo2ARB_was_sent);
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTEST_F(glX_send_client_info_test, doesnt_send_SetClientInfo2ARB_for_1_1)
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* The glXSetClientInfo2ARB protocol was added in GLX 1.4 with the
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * GLX_ARB_create_context_profile extension.  Verify that no
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * glXSetClientInfo2ARB is sent to a GLX server that only has GLX 1.1
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * regardless of the extension setting.
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   common_protocol_expected_false_test(1, 1,
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       "GLX_ARB_create_context_profile",
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       &SetClientInfo2ARB_was_sent);
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTEST_F(glX_send_client_info_test, doesnt_send_SetClientInfo2ARB_for_1_4_with_empty_extensions)
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* The glXSetClientInfo2ARB protocol was added in GLX 1.4 with the
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * GLX_ARB_create_context_profile extension.  Verify that no
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * glXSetClientInfo2ARB is sent to a GLX server that has GLX 1.4 but has an
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * empty extension string (i.e., no extensions at all).
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   common_protocol_expected_false_test(1, 4,
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       "",
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       &SetClientInfo2ARB_was_sent);
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTEST_F(glX_send_client_info_test, doesnt_send_SetClientInfo2ARB_for_1_4_without_extension)
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* The glXSetClientInfo2ARB protocol was added in GLX 1.4 with the
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * GLX_ARB_create_context_profile extension.  Verify that no
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * glXSetClientInfo2ARB is sent to a GLX server that has GLX 1.4 but
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * doesn't have the extension.
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   common_protocol_expected_false_test(1, 4,
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       "GLX_EXT_texture_from_pixmap",
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       &SetClientInfo2ARB_was_sent);
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTEST_F(glX_send_client_info_test, doesnt_send_SetClientInfo2ARB_for_1_4_with_wrong_extension)
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* The glXSetClientInfo2ARB protocol was added in GLX 1.4 with the
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * GLX_ARB_create_context_profile extension.  Verify that no
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * glXSetClientInfo2ARB is sent to a GLX server that has GLX 1.4 but does
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * not have the extension.
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * This test differs from
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * doesnt_send_SetClientInfo2ARB_for_1_4_without_extension in that an
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * extension exists that looks like the correct extension but isn't.
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   common_protocol_expected_false_test(1, 4,
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       "GLX_ARB_create_context_profile2",
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       &SetClientInfo2ARB_was_sent);
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTEST_F(glX_send_client_info_test, does_send_ClientInfo_for_1_1)
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* The glXClientInfo protocol was added in GLX 1.1.  Verify that
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * glXClientInfo is sent to a GLX server that has GLX 1.1.
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   common_protocol_expected_true_test(1, 1,
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      "",
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      &ClientInfo_was_sent);
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTEST_F(glX_send_client_info_test, does_send_SetClientInfoARB_for_1_4_with_extension)
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* The glXSetClientInfoARB protocol was added in GLX 1.4 with the
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * GLX_ARB_create_context extension.  Verify that glXSetClientInfoARB is
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * sent to a GLX server that has GLX 1.4 and the extension.
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   common_protocol_expected_true_test(1, 4,
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      "GLX_ARB_create_context",
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      &SetClientInfoARB_was_sent);
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTEST_F(glX_send_client_info_test, does_send_SetClientInfo2ARB_for_1_4_with_just_profile_extension)
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* The glXSetClientInfoARB protocol was added in GLX 1.4 with the
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * GLX_ARB_create_context extension.  Verify that glXSetClientInfoARB is
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * sent to a GLX server that has GLX 1.4 and the extension.
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   common_protocol_expected_true_test(1, 4,
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      "GLX_ARB_create_context_profile",
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      &SetClientInfo2ARB_was_sent);
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTEST_F(glX_send_client_info_test, does_send_SetClientInfo2ARB_for_1_4_with_both_extensions)
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* The glXSetClientInfoARB protocol was added in GLX 1.4 with the
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * GLX_ARB_create_context extension.  Verify that glXSetClientInfoARB is
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * sent to a GLX server that has GLX 1.4 and the extension.
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   common_protocol_expected_true_test(1, 4,
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      "GLX_ARB_create_context "
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      "GLX_ARB_create_context_profile",
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      &SetClientInfo2ARB_was_sent);
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTEST_F(glX_send_client_info_test, does_send_SetClientInfo2ARB_for_1_4_with_both_extensions_reversed)
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* The glXSetClientInfoARB protocol was added in GLX 1.4 with the
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * GLX_ARB_create_context extension.  Verify that glXSetClientInfoARB is
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * sent to a GLX server that has GLX 1.4 and the extension.
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   common_protocol_expected_true_test(1, 4,
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      "GLX_ARB_create_context_profile "
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      "GLX_ARB_create_context",
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      &SetClientInfo2ARB_was_sent);
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTEST_F(glX_send_client_info_test, uses_correct_connection)
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   create_single_screen_display(1, 1, "");
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __glX_send_client_info(this->glx_dpy);
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EXPECT_EQ((xcb_connection_t *) 0xdeadbeef, connection_used);
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTEST_F(glX_send_client_info_test, sends_correct_gl_extension_string)
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   create_single_screen_display(1, 1, "");
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __glX_send_client_info(this->glx_dpy);
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_EQ((int) sizeof(ext), gl_ext_length);
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_NE((char *) 0, gl_ext_string);
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EXPECT_EQ(0, memcmp(gl_ext_string, ext, sizeof(ext)));
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTEST_F(glX_send_client_info_test, gl_versions_are_sane)
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   create_single_screen_display(1, 4, "GLX_ARB_create_context");
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __glX_send_client_info(this->glx_dpy);
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_NE(0, num_gl_versions);
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned versions_below_3_0 = 0;
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (int i = 0; i < num_gl_versions; i++) {
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      EXPECT_LT(0u, gl_versions[i * 2]);
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      EXPECT_GE(4u, gl_versions[i * 2]);
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Verify that the minor version advertised with the major version makes
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * sense.
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (gl_versions[i * 2]) {
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 1:
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EXPECT_GE(5u, gl_versions[i * 2 + 1]);
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 versions_below_3_0++;
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 2:
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EXPECT_GE(1u, gl_versions[i * 2 + 1]);
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 versions_below_3_0++;
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 3:
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EXPECT_GE(3u, gl_versions[i * 2 + 1]);
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 4:
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EXPECT_GE(2u, gl_versions[i * 2 + 1]);
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* From the GLX_ARB_create_context spec:
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *     "Only the highest supported version below 3.0 should be sent, since
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *     OpenGL 2.1 is backwards compatible with all earlier versions."
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EXPECT_LE(versions_below_3_0, 1u);
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTEST_F(glX_send_client_info_test, gl_versions_and_profiles_are_sane)
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   create_single_screen_display(1, 4, "GLX_ARB_create_context_profile");
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __glX_send_client_info(this->glx_dpy);
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_NE(0, num_gl_versions);
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const uint32_t all_valid_bits = GLX_CONTEXT_CORE_PROFILE_BIT_ARB
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      | GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB;
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned versions_below_3_0 = 0;
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (int i = 0; i < num_gl_versions; i++) {
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      EXPECT_LT(0u, gl_versions[i * 3]);
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      EXPECT_GE(4u, gl_versions[i * 3]);
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Verify that the minor version advertised with the major version makes
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * sense.
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (gl_versions[i * 3]) {
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 1:
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EXPECT_GE(5u, gl_versions[i * 3 + 1]);
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EXPECT_EQ(0u, gl_versions[i * 3 + 2]);
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 versions_below_3_0++;
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 2:
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EXPECT_GE(1u, gl_versions[i * 3 + 1]);
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EXPECT_EQ(0u, gl_versions[i * 3 + 2]);
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 versions_below_3_0++;
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 3:
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EXPECT_GE(3u, gl_versions[i * 3 + 1]);
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* Profiles were not introduced until OpenGL 3.2.
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  */
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (gl_versions[i * 3 + 1] < 2) {
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    EXPECT_EQ(0u, gl_versions[i * 3 + 2]);
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 } else {
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    EXPECT_EQ(0u, gl_versions[i * 3 + 2] & ~all_valid_bits);
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 4:
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EXPECT_GE(2u, gl_versions[i * 3 + 1]);
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EXPECT_EQ(0u, gl_versions[i * 3 + 2] & ~all_valid_bits);
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* From the GLX_ARB_create_context_profile spec:
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *     "Only the highest supported version below 3.0 should be sent, since
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *     OpenGL 2.1 is backwards compatible with all earlier versions."
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EXPECT_LE(versions_below_3_0, 1u);
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTEST_F(glX_send_client_info_test, glx_version_is_1_4_for_1_1)
629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   create_single_screen_display(1, 1, "");
631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __glX_send_client_info(this->glx_dpy);
632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EXPECT_EQ(1, glx_major);
634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EXPECT_EQ(4, glx_minor);
635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTEST_F(glX_send_client_info_test, glx_version_is_1_4_for_1_4)
638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   create_single_screen_display(1, 4, "");
640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __glX_send_client_info(this->glx_dpy);
641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EXPECT_EQ(1, glx_major);
643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EXPECT_EQ(4, glx_minor);
644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTEST_F(glX_send_client_info_test, glx_version_is_1_4_for_1_4_with_ARB_create_context)
647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   create_single_screen_display(1, 4, "GLX_ARB_create_context");
649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __glX_send_client_info(this->glx_dpy);
650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EXPECT_EQ(1, glx_major);
652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EXPECT_EQ(4, glx_minor);
653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTEST_F(glX_send_client_info_test, glx_version_is_1_4_for_1_4_with_ARB_create_context_profile)
656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   create_single_screen_display(1, 4, "GLX_ARB_create_context_profile");
658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __glX_send_client_info(this->glx_dpy);
659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EXPECT_EQ(1, glx_major);
661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EXPECT_EQ(4, glx_minor);
662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTEST_F(glX_send_client_info_test, glx_version_is_1_4_for_1_5)
665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   create_single_screen_display(1, 5, "");
667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __glX_send_client_info(this->glx_dpy);
668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EXPECT_EQ(1, glx_major);
670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EXPECT_EQ(4, glx_minor);
671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTEST_F(glX_send_client_info_test, glx_extensions_has_GLX_ARB_create_context)
674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   create_single_screen_display(1, 4, "GLX_ARB_create_context");
676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __glX_send_client_info(this->glx_dpy);
677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_NE(0, glx_ext_length);
679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_NE((char *) 0, glx_ext_string);
680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool found_GLX_ARB_create_context = false;
682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *const needle = "GLX_ARB_create_context";
683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const unsigned len = strlen(needle);
684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   char *haystack = glx_ext_string;
685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   while (haystack != NULL) {
686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      char *match = strstr(haystack, needle);
687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (match[len] == '\0' || match[len] == ' ') {
689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 found_GLX_ARB_create_context = true;
690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      haystack = match + len;
694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EXPECT_TRUE(found_GLX_ARB_create_context);
697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTEST_F(glX_send_client_info_test, glx_extensions_has_GLX_ARB_create_context_profile)
700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   create_single_screen_display(1, 4, "GLX_ARB_create_context_profile");
702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __glX_send_client_info(this->glx_dpy);
703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_NE(0, glx_ext_length);
705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_NE((char *) 0, glx_ext_string);
706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool found_GLX_ARB_create_context_profile = false;
708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *const needle = "GLX_ARB_create_context_profile";
709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const unsigned len = strlen(needle);
710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   char *haystack = glx_ext_string;
711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   while (haystack != NULL) {
712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      char *match = strstr(haystack, needle);
713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (match[len] == '\0' || match[len] == ' ') {
715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 found_GLX_ARB_create_context_profile = true;
716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      haystack = match + len;
720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EXPECT_TRUE(found_GLX_ARB_create_context_profile);
723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
724