1/* 2 * Mesa 3-D graphics library 3 * 4 * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 5 * Copyright (C) 2010 VMware, Inc. All Rights Reserved. 6 * 7 * Permission is hereby granted, free of charge, to any person obtaining a 8 * copy of this software and associated documentation files (the "Software"), 9 * to deal in the Software without restriction, including without limitation 10 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11 * and/or sell copies of the Software, and to permit persons to whom the 12 * Software is furnished to do so, subject to the following conditions: 13 * 14 * The above copyright notice and this permission notice shall be included 15 * in all copies or substantial portions of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 21 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 22 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 23 * OTHER DEALINGS IN THE SOFTWARE. 24 */ 25 26 27/** 28 * No-op dispatch table. 29 * 30 * This file defines a special dispatch table which is loaded with no-op 31 * functions. 32 * 33 * Mesa can register a "no-op handler function" which will be called in 34 * the event that a no-op function is called. 35 * 36 * In the past, the dispatch table was loaded with pointers to a single 37 * no-op function. But that broke on Windows because the GL entrypoints 38 * use __stdcall convention. __stdcall means the callee cleans up the 39 * stack. So one no-op function can't properly clean up the stack. This 40 * would lead to crashes. 41 * 42 * Another benefit of unique no-op functions is we can accurately report 43 * the function's name in an error message. 44 */ 45 46 47#include <stdlib.h> 48#include <string.h> 49#include "glapi/glapi_priv.h" 50 51 52void 53_glapi_noop_enable_warnings(unsigned char enable) 54{ 55} 56 57void 58_glapi_set_warning_func(_glapi_proc func) 59{ 60} 61 62 63/** 64 * We'll jump though this function pointer whenever a no-op function 65 * is called. 66 */ 67static _glapi_nop_handler_proc nop_handler = NULL; 68 69 70/** 71 * Register the no-op handler call-back function. 72 */ 73void 74_glapi_set_nop_handler(_glapi_nop_handler_proc func) 75{ 76 nop_handler = func; 77} 78 79 80/** 81 * Called by each of the no-op GL entrypoints. 82 */ 83static void 84nop(const char *func) 85{ 86 if (nop_handler) 87 nop_handler(func); 88} 89 90 91/** 92 * This is called if the user somehow calls an unassigned GL dispatch function. 93 */ 94static GLint 95NoOpUnused(void) 96{ 97 nop("unused GL entry point"); 98 return 0; 99} 100 101/* 102 * Defines for the glapitemp.h functions. 103 */ 104#define KEYWORD1 static 105#define KEYWORD1_ALT static 106#define KEYWORD2 GLAPIENTRY 107#define NAME(func) NoOp##func 108#define DISPATCH(func, args, msg) nop(#func); 109#define RETURN_DISPATCH(func, args, msg) nop(#func); return 0 110 111 112/* 113 * Defines for the table of no-op entry points. 114 */ 115#define TABLE_ENTRY(name) (_glapi_proc) NoOp##name 116#define DISPATCH_TABLE_NAME __glapi_noop_table 117#define UNUSED_TABLE_NAME __unused_noop_functions 118 119#include "glapitemp.h" 120 121 122/** Return pointer to new dispatch table filled with no-op functions */ 123struct _glapi_table * 124_glapi_new_nop_table(unsigned num_entries) 125{ 126 struct _glapi_table *table = malloc(num_entries * sizeof(_glapi_proc)); 127 if (table) { 128 memcpy(table, __glapi_noop_table, 129 num_entries * sizeof(_glapi_proc)); 130 } 131 return table; 132} 133