13ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick/* 23ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick * Copyright © 2011 Intel Corporation 33ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick * 43ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick * Permission is hereby granted, free of charge, to any person obtaining a 53ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick * copy of this software and associated documentation files (the "Software"), 63ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick * to deal in the Software without restriction, including without limitation 73ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick * the rights to use, copy, modify, merge, publish, distribute, sublicense, 83ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick * and/or sell copies of the Software, and to permit persons to whom the 93ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick * Software is furnished to do so, subject to the following conditions: 103ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick * 113ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick * The above copyright notice and this permission notice (including the next 123ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick * paragraph) shall be included in all copies or substantial portions of the 133ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick * Software. 143ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick * 153ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 163ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 173ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 183ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 193ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 203ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 213ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick * DEALINGS IN THE SOFTWARE. 223ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick */ 233ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanickextern "C" { 243ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick#include "glxclient.h" 253ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick}; 263ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick 273ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanickclass fake_glx_screen : public glx_screen { 283ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanickpublic: 293ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick fake_glx_screen(struct glx_display *glx_dpy, int num, const char *ext) 303ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick { 313ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick this->vtable = &fake_glx_screen::vt; 323ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick this->serverGLXexts = 0; 333ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick this->effectiveGLXexts = 0; 343ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick this->display = 0; 353ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick this->dpy = 0; 363ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick this->scr = num; 373ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick this->visuals = 0; 383ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick this->configs = 0; 393ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick 403ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick this->display = glx_dpy; 413ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick this->dpy = (glx_dpy != NULL) ? glx_dpy->dpy : NULL; 423ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick 435fb178ee43fbc364b150fe6c6f0f79e8d8b0b179Ian Romanick this->serverGLXexts = new char[strlen(ext) + 1]; 443ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick strcpy((char *) this->serverGLXexts, ext); 453ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick } 463ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick 473ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick ~fake_glx_screen() 483ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick { 493ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick delete [] this->serverGLXexts; 503ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick } 513ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick 523ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanickprivate: 533ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick static struct glx_screen_vtable vt; 543ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick}; 553ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick 563ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanickclass fake_glx_screen_direct : public fake_glx_screen { 573ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanickpublic: 583ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick fake_glx_screen_direct(struct glx_display *glx_dpy, int num, 593ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick const char *ext) 603ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick : fake_glx_screen(glx_dpy, num, ext) 613ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick { 623ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick this->vtable = &fake_glx_screen_direct::vt; 633ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick } 643ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick 653ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanickprivate: 663ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick static struct glx_screen_vtable vt; 673ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick}; 683ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick 693ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanickclass fake_glx_context : public glx_context { 703ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanickpublic: 713ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick fake_glx_context(struct glx_screen *psc, struct glx_config *mode) 723ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick { 733ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick contexts_allocated++; 743ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick 753ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick this->vtable = &fake_glx_context::vt; 763ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick this->majorOpcode = 123; 773ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick this->screen = psc->scr; 783ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick this->psc = psc; 793ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick this->config = mode; 803ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick this->isDirect = false; 813ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick this->currentContextTag = -1; 823ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick 833ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick this->client_state_private = (struct __GLXattributeRec *) 0xcafebabe; 843ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick } 853ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick 863ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick ~fake_glx_context() 873ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick { 883ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick contexts_allocated--; 893ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick } 903ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick 913ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick static glx_context *create_attribs(struct glx_screen *psc, 923ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick struct glx_config *mode, 933ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick struct glx_context *shareList, 943ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick unsigned num_attribs, 953ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick const uint32_t *attribs, 963ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick unsigned *error) 973ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick { 983ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick (void) shareList; 993ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick (void) num_attribs; 1003ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick (void) attribs; 1013ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick 1023ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick *error = 0; 1033ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick return new fake_glx_context(psc, mode); 1043ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick } 1053ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick 1063ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick /** Number of context that are allocated (and not freed). */ 1073ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick static int contexts_allocated; 1083ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick 1093ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanickprivate: 1103ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick static const struct glx_context_vtable vt; 1113ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick 1123ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick static void destroy(struct glx_context *gc) 1133ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick { 1143ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick delete gc; 1153ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick } 1163ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick}; 1173ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick 1183ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanickclass fake_glx_context_direct : public fake_glx_context { 1193ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanickpublic: 1203ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick fake_glx_context_direct(struct glx_screen *psc, struct glx_config *mode) 1213ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick : fake_glx_context(psc, mode) 1223ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick { 1233ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick this->isDirect = True; 1243ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick } 1253ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick 1263ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick static glx_context *create(struct glx_screen *psc, struct glx_config *mode, 1273ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick struct glx_context *shareList, int renderType) 1283ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick { 1293ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick (void) shareList; 1303ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick (void) renderType; 1313ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick 1323ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick return new fake_glx_context_direct(psc, mode); 1333ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick } 1343ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick 1353ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick static glx_context *create_attribs(struct glx_screen *psc, 1363ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick struct glx_config *mode, 1373ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick struct glx_context *shareList, 1383ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick unsigned num_attribs, 1393ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick const uint32_t *attribs, 1403ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick unsigned *error) 1413ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick { 1423ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick (void) shareList; 1433ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick (void) num_attribs; 1443ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick (void) attribs; 1453ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick 1463ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick *error = 0; 1473ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick return new fake_glx_context_direct(psc, mode); 1483ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick } 1493ef3ba4d2eee36f64062a21ce030c3f4d8c4cac4Ian Romanick}; 150