Fix support for a static build of Epoxy. Add support building and running tests with CMake. Add support for linking with the static run-time library with MSVC.

macos/v1.5.9
Yaron Cohen-Tal 9 years ago
parent 64e2ee2ca8
commit 44d51f2844
  1. 88
      CMakeLists.txt
  2. 16
      README.md
  3. 12
      cmake/FindEGL.cmake
  4. 12
      cmake/FindGLESv1.cmake
  5. 12
      cmake/FindGLESv2.cmake
  6. 17
      cmake/epoxy_run_test_wrapper.cmake
  7. 29
      include/epoxy/common.h
  8. 85
      src/CMakeLists.txt
  9. 3
      src/dispatch_common.c
  10. 0
      src/dispatch_common.h
  11. 2
      src/dispatch_egl.c
  12. 75
      src/dispatch_wgl.c
  13. 101
      src/dllmain.c
  14. 150
      test/CMakeLists.txt
  15. 5
      test/egl_and_glx_different_pointers.c
  16. 3
      test/egl_gl.c
  17. 3
      test/egl_has_extension_nocontext.c
  18. 3
      test/egl_without_glx.c
  19. 5
      test/glx_alias_prefer_same_name.c
  20. 3
      test/glx_beginend.c
  21. 4
      test/glx_common.c
  22. 4
      test/glx_gles2.c
  23. 3
      test/glx_glxgetprocaddress_nocontext.c
  24. 3
      test/glx_has_extension_nocontext.c
  25. 3
      test/glx_public_api.c
  26. 3
      test/glx_public_api_core.c
  27. 3
      test/glx_static.c
  28. 43
      test/headerguards.c
  29. 21
      test/khronos_typedefs_nonepoxy.c
  30. 6
      test/miscdefines.c
  31. 4
      test/wgl_common.c
  32. 4
      test/wgl_core_and_exts.c
  33. 6
      test/wgl_per_context_funcptrs.c
  34. 8
      test/wgl_usefontbitmaps.c

@ -1,50 +1,98 @@
cmake_minimum_required (VERSION 3.0)
cmake_policy (VERSION 3.0)
if (NOT CMAKE_VERSION VERSION_LESS "3.1")
cmake_policy (SET CMP0054 NEW)
cmake_policy (SET CMP0054 OLD)
endif ()
if (NOT CMAKE_VERSION VERSION_LESS "3.3")
cmake_policy (SET CMP0063 NEW)
set (HONOR_VISIBILITY TRUE)
else ()
set (HONOR_VISIBILITY FALSE)
endif ()
project (Epoxy VERSION 1.3.1 LANGUAGES C)
set (TARGET_NAME epoxy)
set (TARGET_VER 1.3.1_yaronct-4)
set (EPOXY_TARGET_NAME epoxy)
set (TARGET_VER 1.3.1_yaronct-5)
set (TARGET_ABI_VER 0)
set (TARGET_OUTPUT_NAME "${TARGET_NAME}")
set (TARGET_OUTPUT_NAME "${EPOXY_TARGET_NAME}")
include (GNUInstallDirs)
include (CMakeDependentOption)
set (CMAKE_C_VISIBILITY_PRESET "hidden")
set (COMPILER_ID_MSVC MSVC)
set (COMPILER_ID_GCC GNU)
set (COMPILER_ID_CLANG Clang)
if ((CMAKE_C_COMPILER_ID STREQUAL "GNU") OR (CMAKE_C_COMPILER_ID STREQUAL "Clang"))
if ((CMAKE_C_COMPILER_ID STREQUAL COMPILER_ID_GCC) OR (CMAKE_C_COMPILER_ID STREQUAL COMPILER_ID_CLANG))
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99")
elseif (NOT CMAKE_VERSION VERSION_LESS "3.1")
set (CMAKE_C_STANDARD_REQUIRED TRUE)
set (CMAKE_C_STANDARD "99")
endif ()
if ((CMAKE_C_COMPILER_ID STREQUAL "GNU") OR (CMAKE_C_COMPILER_ID STREQUAL "Clang"))
if ((CMAKE_C_COMPILER_ID STREQUAL COMPILER_ID_GCC) OR (CMAKE_C_COMPILER_ID STREQUAL COMPILER_ID_CLANG))
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-strict-aliasing -Wall -Wextra")
elseif (CMAKE_C_COMPILER_ID STREQUAL "MSVC")
if (NOT CMAKE_C_FLAGS MATCHES "/W[0-4]")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W4")
endif ()
elseif (CMAKE_C_COMPILER_ID STREQUAL COMPILER_ID_MSVC)
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3")
endif ()
set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
find_package (X11)
find_package (PythonInterp)
find_package (EGL)
find_package (GLESv1)
find_package (GLESv2)
find_package (OpenGL)
include (CMakeDependentOption)
option (EPOXY_REBUILD_FROM_SPECS "Whether to rebuild the auto-generated sources and headers from the specs" FALSE)
option (EPOXY_REBUILD_FROM_SPECS "Rebuild the auto-generated sources and headers from the specs" FALSE)
if (EPOXY_REBUILD_FROM_SPECS AND NOT PYTHONINTERP_FOUND)
message (FATAL_ERROR "You've set \"EPOXY_REBUILD_FROM_SPECS\" to \"TRUE\", which requires a python interpreter, but one couldn't be found.")
endif ()
option (EPOXY_SUPPORT_EGL "Whether to build with EGL support" TRUE)
cmake_dependent_option (EPOXY_SUPPORT_WGL "Whether to build with WGL support" ON WIN32 OFF)
cmake_dependent_option (EPOXY_SUPPORT_GLX "Whether to build with GLX support" "${X11_FOUND}" "NOT (WIN32 OR ANDROID)" OFF)
option (EPOXY_SUPPORT_EGL "Build with EGL support" ON)
cmake_dependent_option (EPOXY_SUPPORT_WGL "Build with WGL support" ON WIN32 OFF)
if (X11_FOUND AND OPENGL_FOUND)
set (EPOXY_GLX_FOUND TRUE)
else ()
set (EPOXY_GLX_FOUND FALSE)
endif ()
cmake_dependent_option (EPOXY_SUPPORT_GLX "Build with GLX support"
"${EPOXY_GLX_FOUND}" "NOT (WIN32 OR ANDROID)" OFF)
option (EPOXY_BUILD_SHARED "Whether to build a shared library" TRUE)
option (EPOXY_BUILD_STATIC "Whether to build a static library" FALSE)
option (EPOXY_BUILD_SHARED "Build a shared library" ON)
option (EPOXY_BUILD_STATIC "Build a static library" OFF)
if (DEFINED CMAKE_TOOLCHAIN_FILE)
set (EPOXY_BUILD_TESTS_DEFAULT FALSE)
else ()
set (EPOXY_BUILD_TESTS_DEFAULT TRUE)
endif ()
option (EPOXY_BUILD_TESTS "Build tests" "${EPOXY_BUILD_TESTS_DEFAULT}")
cmake_dependent_option (EPOXY_MSVC_USE_RUNTIME_LIBRARY_DLL "Link with MSVC Runtime Library DLL" ON
"CMAKE_C_COMPILER_ID STREQUAL COMPILER_ID_MSVC" OFF)
configure_file ("include/epoxy/config.h.in" "include/epoxy/config.h")
set (EPOXY_INCLUDE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/include"
"${CMAKE_CURRENT_BINARY_DIR}/include"
"${CMAKE_CURRENT_SOURCE_DIR}/src")
if (CMAKE_C_COMPILER_ID STREQUAL COMPILER_ID_MSVC
AND NOT EPOXY_MSVC_USE_RUNTIME_LIBRARY_DLL)
foreach (flags CMAKE_C_FLAGS
CMAKE_C_FLAGS_DEBUG
CMAKE_C_FLAGS_RELEASE
CMAKE_C_FLAGS_MINSIZEREL
CMAKE_C_FLAGS_RELWITHDEBINFO)
string (REGEX REPLACE "/MDd" "/MTd" ${flags} "${${flags}}")
string (REGEX REPLACE "/MD" "/MT" ${flags} "${${flags}}")
endforeach ()
endif ()
add_subdirectory (src)
if (EPOXY_BUILD_TESTS)
enable_testing ()
add_subdirectory (test)
endif ()

@ -28,7 +28,11 @@ Features
Building (CMake)
-----------------
CMake is now the recommended way to build epoxy. It should be as simple as:
CMake is now the recommended way to build epoxy. It supports building both
shared and static libraries (by default only shared library is built). It also
supports building and running tests, both for the static and the shared library.
Building with CMake should be as simple as:
cd <my-build_dir>
cmake <my-source-dir>
@ -46,8 +50,11 @@ solution.
* To disable building shared libraries, add
"-DEPOXY_BUILD_SHARED=OFF" to the "cmake" invocation.
Note that building with CMake currently doesn't support building or running
tests.
* To disable building tests, add
"-DEPOXY_BUILD_TESTS=OFF" to the "cmake" invocation.
* To link to the static Runtime Library with MSVC (rather than to the DLL), add
"-DEPOXY_MSVC_USE_RUNTIME_LIBRARY_DLL=OFF" to the "cmake" invocation.
Building (Autotools)
---------------------
@ -100,6 +107,9 @@ tests.
Switching your Code to Use Epoxy
---------------------------------
* NOTE: If you use the static version of Epoxy, you must build your project with
"EPOXY_STATIC_LIB" defined!
It should be as easy as replacing:
#include <GL/gl.h>

@ -0,0 +1,12 @@
# Find EGL
#
# EGL_LIBRARY
# EGL_FOUND
set (EGL_NAMES ${EGL_NAMES} egl EGL libEGL)
find_library (EGL_LIBRARY NAMES ${EGL_NAMES} PATHS /opt/vc/lib)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(EGL DEFAULT_MSG EGL_LIBRARY)
mark_as_advanced(EGL_LIBRARY)

@ -0,0 +1,12 @@
# Find GLESv1
#
# GLESv1_LIBRARY
# GLESv1_FOUND
set(GLESv1_NAMES ${GLESv1_NAMES} GLESv1_CM libGLES_CM)
find_library (GLESv1_LIBRARY NAMES ${GLESv1_NAMES} PATHS /opt/vc/lib)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args (GLESv1 DEFAULT_MSG GLESv1_LIBRARY)
mark_as_advanced (GLESv1_LIBRARY)

@ -0,0 +1,12 @@
# Find GLESv2
#
# GLESv2_LIBRARY
# GLESv2_FOUND
set (GLESv2_NAMES ${GLESv2_NAMES} GLESv2 libGLESv2)
find_library (GLESv2_LIBRARY NAMES ${GLESv2_NAMES} PATHS /opt/vc/lib)
include (FindPackageHandleStandardArgs)
find_package_handle_standard_args (GLESv2 DEFAULT_MSG GLESv2_LIBRARY)
mark_as_advanced (GLESv2_LIBRARY)

@ -0,0 +1,17 @@
cmake_minimum_required (VERSION 3.0)
if (NOT CMAKE_VERSION VERSION_LESS "3.1")
cmake_policy (SET CMP0054 OLD)
endif ()
if (WIN32 AND DEFINED EPOXY_SHARED_LIB)
get_filename_component (EPOXY_SHARED_LIB_DIR "${EPOXY_SHARED_LIB}" DIRECTORY)
file (TO_NATIVE_PATH "${EPOXY_SHARED_LIB_DIR}" EPOXY_SHARED_LIB_DIR)
if (NOT DEFINED ENV{PATH} OR ENV{PATH} STREQUAL "")
set (ENV{PATH} "${EPOXY_SHARED_LIB_DIR}")
else ()
set (ENV{PATH} "${EPOXY_SHARED_LIB_DIR};$ENV{PATH}")
endif ()
endif ()
execute_process (COMMAND "${EPOXY_TEST_CMD}" RESULT_VARIABLE TEST_RETURN_VAL)
if (NOT TEST_RETURN_VAL EQUAL 0 AND NOT TEST_RETURN_VAL EQUAL 77)
message (FATAL_ERROR "Test has failed!")
endif ()

@ -38,28 +38,35 @@ extern "C" {
#endif
#if defined _WIN32 || defined __CYGWIN__
#ifdef EPOXY_EXPORTS
#ifdef __GNUC__
#define EPOXY_IMPORTEXPORT __attribute__ ((dllexport))
#else
#define EPOXY_IMPORTEXPORT __declspec(dllexport)
#endif
#if defined EPOXY_STATIC_LIB
#define EPOXY_IMPORTEXPORT
#else
#ifdef __GNUC__
#define EPOXY_IMPORTEXPORT __attribute__ ((dllimport))
#if defined EPOXY_BUILDING_LIB
#ifdef __GNUC__
#define EPOXY_IMPORTEXPORT __attribute__((dllexport))
#else
#define EPOXY_IMPORTEXPORT __declspec(dllexport)
#endif
#else
#define EPOXY_IMPORTEXPORT __declspec(dllimport)
#ifdef __GNUC__
#define EPOXY_IMPORTEXPORT __attribute__((dllimport))
#else
#define EPOXY_IMPORTEXPORT __declspec(dllimport)
#endif
#endif
#endif
#elif defined __ANDROID__
#include <sys/cdefs.h>
#define EPOXY_IMPORTEXPORT __attribute__((visibility("default"))) __NDK_FPABI__
#elif (defined __GNUC__ && __GNUC__ >= 4) || (defined __SUNPRO_C && __SUNPRO_C >= 0x590)
#define EPOXY_IMPORTEXPORT __attribute__ ((visibility ("default")))
#elif (defined __GNUC__ && __GNUC__ >= 4) || (defined __SUNPRO_C && __SUNPRO_C >= 0x590)
#define EPOXY_IMPORTEXPORT __attribute__((visibility("default")))
#else
#define EPOXY_IMPORTEXPORT
#endif
// Prevent "unused variable/parameter" warnings.
#define EPOXY_UNUSED(var) ((void)var)
#ifdef __cplusplus
}
#endif

@ -63,62 +63,61 @@ if (EPOXY_SUPPORT_WGL)
"${CMAKE_CURRENT_BINARY_DIR}/../include/epoxy/wgl_generated.h")
endif ()
set (EPOXY_INCLUDE_DIRS "../include"
"${CMAKE_CURRENT_BINARY_DIR}/../include"
"${CMAKE_CURRENT_SOURCE_DIR}")
set (TARGET_OBJS_NAME "${TARGET_NAME}_objs")
add_library ("${TARGET_NAME}_objs" OBJECT ${SOURCES} ${HEADERS})
set_target_properties ("${TARGET_NAME}_objs" PROPERTIES
POSITION_INDEPENDENT_CODE TRUE)
target_include_directories ("${TARGET_NAME}_objs" PUBLIC ${EPOXY_INCLUDE_DIRS})
if (CMAKE_C_COMPILER_ID STREQUAL "MSVC")
target_compile_definitions ("${TARGET_NAME}_objs" PUBLIC "inline=__inline" EPOXY_EXPORTS)
endif ()
set (EPOXY_LIBS_FILES $<TARGET_OBJECTS:${TARGET_NAME}_objs>)
if (WIN32)
set (EPOXY_LIBS_EXTRA_FILES dllmain.c)
else ()
set (EPOXY_LIBS_EXTRA_FILES "")
set (EPOXY_COMPILE_DEFS PRIVATE EPOXY_BUILDING_LIB)
if (CMAKE_C_COMPILER_ID STREQUAL COMPILER_ID_MSVC)
set (EPOXY_COMPILE_DEFS ${EPOXY_COMPILE_DEFS} "inline=__inline")
endif ()
set (TARGETS_BUILT_NAMES "")
set (EPOXY_TARGET_CODE ${SOURCES} ${HEADERS})
set (EPOXY_TARGETS_BUILT_NAMES "")
if (EPOXY_BUILD_SHARED)
list (APPEND TARGETS_BUILT_NAMES "${TARGET_NAME}_shared")
add_library ("${TARGET_NAME}_shared" SHARED $<TARGET_OBJECTS:${TARGET_NAME}_objs> ${EPOXY_LIBS_EXTRA_FILES})
list (APPEND EPOXY_TARGETS_BUILT_NAMES "${EPOXY_TARGET_NAME}_shared")
add_library ("${EPOXY_TARGET_NAME}_shared" SHARED ${EPOXY_TARGET_CODE})
target_link_libraries ("${EPOXY_TARGET_NAME}_shared" ${CMAKE_DL_LIBS})
if (WIN32 OR ANDROID)
set_target_properties ("${TARGET_NAME}_shared" PROPERTIES
OUTPUT_NAME "${TARGET_OUTPUT_NAME}_${TARGET_ABI_VER}")
set_target_properties ("${EPOXY_TARGET_NAME}_shared" PROPERTIES
OUTPUT_NAME "${TARGET_OUTPUT_NAME}_${TARGET_ABI_VER}")
else ()
set_target_properties ("${TARGET_NAME}_shared" PROPERTIES
OUTPUT_NAME "${TARGET_OUTPUT_NAME}")
set_target_properties ("${EPOXY_TARGET_NAME}_shared" PROPERTIES
OUTPUT_NAME "${TARGET_OUTPUT_NAME}")
endif ()
if (NOT ANDROID)
set_target_properties("${TARGET_NAME}_shared" PROPERTIES
VERSION "${TARGET_VER}"
SOVERSION "${TARGET_ABI_VER}")
set_target_properties("${EPOXY_TARGET_NAME}_shared" PROPERTIES
VERSION "${TARGET_VER}"
SOVERSION "${TARGET_ABI_VER}")
endif ()
target_include_directories ("${TARGET_NAME}_shared" PUBLIC ${EPOXY_INCLUDE_DIRS})
target_compile_definitions ("${TARGET_NAME}_shared" PUBLIC EPOXY_EXPORTS EPOXY_BUILDING_SHARED_LIB)
target_include_directories ("${EPOXY_TARGET_NAME}_shared" PUBLIC ${EPOXY_INCLUDE_DIRS})
target_compile_definitions ("${EPOXY_TARGET_NAME}_shared" PRIVATE ${EPOXY_COMPILE_DEFS})
set_target_properties ("${EPOXY_TARGET_NAME}_shared" PROPERTIES C_VISIBILITY_PRESET hidden)
endif ()
if (EPOXY_BUILD_STATIC)
list (APPEND TARGETS_BUILT_NAMES "${TARGET_NAME}_static")
add_library ("${TARGET_NAME}_static" STATIC $<TARGET_OBJECTS:${TARGET_NAME}_objs> ${EPOXY_LIBS_EXTRA_FILES})
list (APPEND EPOXY_TARGETS_BUILT_NAMES "${EPOXY_TARGET_NAME}_static")
add_library ("${EPOXY_TARGET_NAME}_static" STATIC ${EPOXY_TARGET_CODE})
target_link_libraries ("${EPOXY_TARGET_NAME}_static" ${CMAKE_DL_LIBS})
if (WIN32)
set_target_properties ("${TARGET_NAME}_static" PROPERTIES
OUTPUT_NAME "${TARGET_OUTPUT_NAME}_static_${TARGET_ABI_VER}")
set_target_properties ("${EPOXY_TARGET_NAME}_static" PROPERTIES
OUTPUT_NAME "${TARGET_OUTPUT_NAME}_static_${TARGET_ABI_VER}")
else ()
set_target_properties ("${TARGET_NAME}_static" PROPERTIES
OUTPUT_NAME "${TARGET_OUTPUT_NAME}_${TARGET_ABI_VER}")
set_target_properties ("${EPOXY_TARGET_NAME}_static" PROPERTIES
OUTPUT_NAME "${TARGET_OUTPUT_NAME}_${TARGET_ABI_VER}")
endif ()
target_include_directories ("${EPOXY_TARGET_NAME}_static" PUBLIC ${EPOXY_INCLUDE_DIRS})
target_compile_definitions ("${EPOXY_TARGET_NAME}_static" PRIVATE ${EPOXY_COMPILE_DEFS} EPOXY_STATIC_LIB)
if (HONOR_VISIBILITY)
set_target_properties ("${EPOXY_TARGET_NAME}_static" PROPERTIES C_VISIBILITY_PRESET hidden)
elseif ((CMAKE_C_COMPILER_ID STREQUAL COMPILER_ID_GCC) OR (CMAKE_C_COMPILER_ID STREQUAL COMPILER_ID_CLANG))
target_compile_options ("${EPOXY_TARGET_NAME}_static" PRIVATE "-fvisibility=hidden")
endif ()
target_include_directories ("${TARGET_NAME}_static" PUBLIC ${EPOXY_INCLUDE_DIRS})
target_compile_definitions ("${TARGET_NAME}_static" PUBLIC EPOXY_EXPORTS EPOXY_BUILDING_STATIC_LIB)
endif ()
install (FILES ${HEADERS} DESTINATION "include/epoxy")
install (TARGETS ${TARGETS_BUILT_NAMES}
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib)
if (CMAKE_C_COMPILER_ID STREQUAL "MSVC")
INSTALL (FILES "${CMAKE_CURRENT_BINARY_DIR}/Debug/${TARGET_OUTPUT_NAME}_${TARGET_ABI_VER}.pdb"
install (TARGETS ${EPOXY_TARGETS_BUILT_NAMES}
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}")
if (CMAKE_C_COMPILER_ID STREQUAL COMPILER_ID_MSVC)
install (FILES "${CMAKE_CURRENT_BINARY_DIR}/Debug/${TARGET_OUTPUT_NAME}_${TARGET_ABI_VER}.pdb"
DESTINATION lib CONFIGURATIONS Debug)
endif ()

@ -224,6 +224,7 @@ get_dlopen_handle(void **handle, const char *lib_name, bool exit_on_fail)
}
#ifdef _WIN32
EPOXY_UNUSED(exit_on_fail);
*handle = LoadLibraryA(lib_name);
#else
pthread_mutex_lock(&api.mutex);
@ -361,7 +362,7 @@ bool
epoxy_extension_in_string(const char *extension_list, const char *ext)
{
const char *ptr = extension_list;
int len = strlen(ext);
size_t len = strlen(ext);
/* Make sure that don't just find an extension with our name as a prefix. */
while (true) {

@ -52,7 +52,7 @@ epoxy_egl_version(EGLDisplay dpy)
version_string = eglQueryString(dpy, EGL_VERSION);
ret = sscanf(version_string, "%d.%d", &major, &minor);
(void)ret; // Prevent "warning: variable 'ret' set but not used".
EPOXY_UNUSED(ret);
assert(ret == 2);
return major * 10 + minor;
}

@ -89,6 +89,81 @@ epoxy_handle_external_wglMakeCurrent(void)
}
}
/**
* This global symbol is apparently looked up by Windows when loading
* a DLL, but it doesn't declare the prototype.
*/
BOOL WINAPI
DllMain(HINSTANCE dll, DWORD reason, LPVOID reserved);
BOOL WINAPI
DllMain(HINSTANCE dll, DWORD reason, LPVOID reserved)
{
void *data;
(void)dll; // Prevent "unused parameter" warning.
(void)reserved; // Prevent "unused parameter" warning.
switch (reason) {
case DLL_PROCESS_ATTACH:
gl_tls_index = TlsAlloc();
if (gl_tls_index == TLS_OUT_OF_INDEXES)
return FALSE;
wgl_tls_index = TlsAlloc();
if (wgl_tls_index == TLS_OUT_OF_INDEXES)
return FALSE;
epoxy_first_context_current = false;
/* FALLTHROUGH */
case DLL_THREAD_ATTACH:
data = LocalAlloc(LPTR, gl_tls_size);
TlsSetValue(gl_tls_index, data);
data = LocalAlloc(LPTR, wgl_tls_size);
TlsSetValue(wgl_tls_index, data);
break;
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
data = TlsGetValue(gl_tls_index);
LocalFree(data);
data = TlsGetValue(wgl_tls_index);
LocalFree(data);
if (reason == DLL_PROCESS_DETACH) {
TlsFree(gl_tls_index);
TlsFree(wgl_tls_index);
}
break;
}
return TRUE;
}
#ifdef EPOXY_STATIC_LIB
#ifdef __GNUC__
PIMAGE_TLS_CALLBACK dllmain_callback __attribute__((section(".CRT$XLB"))) = (PIMAGE_TLS_CALLBACK)DllMain;
#else
# ifdef _WIN64
# pragma comment(linker, "/INCLUDE:_tls_used")
# pragma comment(linker, "/INCLUDE:dllmain_callback")
# pragma const_seg(".CRT$XLB")
extern const PIMAGE_TLS_CALLBACK dllmain_callback;
const PIMAGE_TLS_CALLBACK dllmain_callback = DllMain;
# pragma const_seg()
# else
# pragma comment(linker, "/INCLUDE:__tls_used")
# pragma comment(linker, "/INCLUDE:_dllmain_callback")
# pragma data_seg(".CRT$XLB")
PIMAGE_TLS_CALLBACK dllmain_callback = DllMain;
# pragma data_seg()
# endif
#endif
#endif
WRAPPER_VISIBILITY (BOOL)
WRAPPER(epoxy_wglMakeCurrent)(HDC hdc, HGLRC hglrc)
{

@ -1,101 +0,0 @@
/*
* Copyright © 2013 Intel Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
#if !defined _WIN32
#error This file should only be used in Windows.
#endif
#include "dispatch_common.h"
/**
* This global symbol is apparently looked up by Windows when loading
* a DLL, but it doesn't declare the prototype.
*/
BOOL WINAPI
DllMain(HINSTANCE dll, DWORD reason, LPVOID reserved);
BOOL WINAPI
DllMain(HINSTANCE dll, DWORD reason, LPVOID reserved)
{
void *data;
switch (reason) {
case DLL_PROCESS_ATTACH:
gl_tls_index = TlsAlloc();
if (gl_tls_index == TLS_OUT_OF_INDEXES)
return FALSE;
wgl_tls_index = TlsAlloc();
if (wgl_tls_index == TLS_OUT_OF_INDEXES)
return FALSE;
epoxy_first_context_current = false;
/* FALLTHROUGH */
case DLL_THREAD_ATTACH:
data = LocalAlloc(LPTR, gl_tls_size);
TlsSetValue(gl_tls_index, data);
data = LocalAlloc(LPTR, wgl_tls_size);
TlsSetValue(wgl_tls_index, data);
break;
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
data = TlsGetValue(gl_tls_index);
LocalFree(data);
data = TlsGetValue(wgl_tls_index);
LocalFree(data);
if (reason == DLL_PROCESS_DETACH) {
TlsFree(gl_tls_index);
TlsFree(wgl_tls_index);
}
break;
}
return TRUE;
}
#ifdef EPOXY_BUILDING_STATIC_LIB
#ifdef __GNUC__
PIMAGE_TLS_CALLBACK dllmain_callback __attribute__((section(".CRT$XLB"))) = (PIMAGE_TLS_CALLBACK)DllMain;
#else
# ifdef _WIN64
# pragma comment(linker, "/INCLUDE:_tls_used")
# pragma comment(linker, "/INCLUDE:dllmain_callback")
# pragma const_seg(".CRT$XLB")
extern const PIMAGE_TLS_CALLBACK dllmain_callback;
const PIMAGE_TLS_CALLBACK dllmain_callback = DllMain;
# pragma const_seg()
# else
# pragma comment(linker, "/INCLUDE:__tls_used")
# pragma comment(linker, "/INCLUDE:_dllmain_callback")
# pragma data_seg(".CRT$XLB")
PIMAGE_TLS_CALLBACK dllmain_callback = DllMain;
# pragma data_seg()
# endif
#endif
#endif

@ -0,0 +1,150 @@
if (EPOXY_BUILD_TESTS)
if (EPOXY_BUILD_SHARED)
set (TESTS_TARGET_NAME "${EPOXY_TARGET_NAME}_shared")
else ()
set (TESTS_TARGET_NAME "${EPOXY_TARGET_NAME}_static")
endif ()
if (EPOXY_SUPPORT_EGL)
if (EGL_FOUND)
set (EPOXY_BUILD_EGL_TESTS TRUE)
set (EPOXY_EGL_TESTS_COMMON egl_common.c egl_common.h)
else ()
set (EPOXY_BUILD_EGL_TESTS FALSE)
message (WARNING "EGL not found - EGL tests will not be built!")
endif ()
endif ()
if (EPOXY_SUPPORT_GLX)
set (EPOXY_GLX_TESTS_COMMON glx_common.c glx_common.h)
endif ()
if (EPOXY_SUPPORT_WGL)
set (EPOXY_WGL_TESTS_COMMON wgl_common.c wgl_common.h)
endif ()
set (EPOXY_LINKAGE_TYPE_SHARED SHARED)
set (EPOXY_LINKAGE_TYPE_STATIC STATIC)
function (epoxy_add_test EPOXY_TEST_NAME EPOXY_TEST_CODE)
# Additional optional arguments: "EPOXY_TEST_DEPS EPOXY_TEST_COMPILE_DEFS EPOXY_TEST_LINK_FLAGS"
# "EPOXY_LINKAGE_TYPE"
if (ARGC GREATER 2)
set (EPOXY_TEST_DEPS "${ARGV2}")
else ()
set (EPOXY_TEST_DEPS "")
endif ()
if (ARGC GREATER 3)
set (EPOXY_TEST_COMPILE_DEFS "${ARGV3}")
else ()
set (EPOXY_TEST_COMPILE_DEFS "")
endif ()
if (ARGC GREATER 4)
set (EPOXY_TEST_LINK_FLAGS "${ARGV4}")
else ()
set (EPOXY_TEST_LINK_FLAGS "")
endif ()
if (ARGC GREATER 5)
set (EPOXY_TEST_LINKAGE_TYPE "${ARGV5}")
else ()
set (EPOXY_TEST_LINKAGE_TYPE BOTH)
endif ()
if (EPOXY_BUILD_SHARED AND NOT EPOXY_TEST_LINKAGE_TYPE STREQUAL EPOXY_LINKAGE_TYPE_STATIC)
set (EPOXY_TEST_TARGET_NAME "test_shared_${EPOXY_TEST_NAME}")
add_executable (${EPOXY_TEST_TARGET_NAME} ${EPOXY_TEST_CODE})
target_link_libraries (${EPOXY_TEST_TARGET_NAME} "${EPOXY_TARGET_NAME}_shared" ${EPOXY_TEST_DEPS})
target_compile_definitions (${EPOXY_TEST_TARGET_NAME} PRIVATE
${EPOXY_TEST_COMPILE_DEFS})
target_include_directories (${EPOXY_TEST_TARGET_NAME} PRIVATE ${EPOXY_INCLUDE_DIRS})
set_target_properties (${EPOXY_TEST_TARGET_NAME} PROPERTIES
LINK_FLAGS "${EPOXY_TEST_LINK_FLAGS}")
add_test (NAME "${EPOXY_TEST_TARGET_NAME}"
COMMAND "${CMAKE_COMMAND}"
"-DEPOXY_TEST_CMD=$<TARGET_FILE:${EPOXY_TEST_TARGET_NAME}>"
"-DEPOXY_SHARED_LIB=$<TARGET_FILE:${EPOXY_TARGET_NAME}_shared>"
"-P" "${CMAKE_CURRENT_SOURCE_DIR}/../cmake/epoxy_run_test_wrapper.cmake")
endif ()
if (EPOXY_BUILD_STATIC AND NOT EPOXY_TEST_LINKAGE_TYPE STREQUAL EPOXY_LINKAGE_TYPE_SHARED)
set (EPOXY_TEST_TARGET_NAME "test_static_${EPOXY_TEST_NAME}")
add_executable (${EPOXY_TEST_TARGET_NAME} ${EPOXY_TEST_CODE})
target_link_libraries (${EPOXY_TEST_TARGET_NAME} "${EPOXY_TARGET_NAME}_static" ${EPOXY_TEST_DEPS})
target_compile_definitions (${EPOXY_TEST_TARGET_NAME} PRIVATE
${EPOXY_TEST_COMPILE_DEFS} EPOXY_STATIC_LIB)
target_include_directories (${EPOXY_TEST_TARGET_NAME} PRIVATE ${EPOXY_INCLUDE_DIRS})
set_target_properties (${EPOXY_TEST_TARGET_NAME} PROPERTIES
LINK_FLAGS "${EPOXY_TEST_LINK_FLAGS}")
add_test (NAME "${EPOXY_TEST_TARGET_NAME}"
COMMAND "${CMAKE_COMMAND}"
"-DEPOXY_TEST_CMD=$<TARGET_FILE:${EPOXY_TEST_TARGET_NAME}>"
"-P" "${CMAKE_CURRENT_SOURCE_DIR}/../cmake/epoxy_run_test_wrapper.cmake")
endif ()
endfunction ()
if (EPOXY_BUILD_EGL_TESTS AND X11_FOUND)
epoxy_add_test (egl_has_extension_nocontext "${EPOXY_EGL_TESTS_COMMON};egl_has_extension_nocontext.c"
"${X11_LIBRARIES}")
epoxy_add_test (egl_gl "${EPOXY_EGL_TESTS_COMMON};egl_gl.c" "${X11_LIBRARIES}")
if (GLESv1_FOUND)
epoxy_add_test (egl_gles1_without_glx "${EPOXY_EGL_TESTS_COMMON};egl_without_glx.c" "${X11_LIBRARIES}"
"GLES_VERSION=1")
endif ()
if (GLESv2_FOUND)
epoxy_add_test (egl_gles2_without_glx "${EPOXY_EGL_TESTS_COMMON};egl_without_glx.c" "${X11_LIBRARIES}"
"GLES_VERSION=2")
endif ()
endif()
if (EPOXY_BUILD_EGL_TESTS AND EPOXY_SUPPORT_GLX AND NOT APPLE)
#epoxy_add_test (egl_and_glx_different_pointers "${EPOXY_EGL_TESTS_COMMON};${EPOXY_GLX_TESTS_COMMON};egl_and_glx_different_pointers.c;dlwrap.c;dlwrap.h" "${X11_LIBRARIES}" "USE_EGL;USE_GLX" "-rdynamic")
epoxy_add_test (egl_different_pointers
"${EPOXY_EGL_TESTS_COMMON};${EPOXY_GLX_TESTS_COMMON};egl_and_glx_different_pointers.c;dlwrap.c;dlwrap.h"
"${X11_LIBRARIES}" "USE_EGL" "-rdynamic")
epoxy_add_test (glx_different_pointers
"${EPOXY_EGL_TESTS_COMMON};${EPOXY_GLX_TESTS_COMMON};egl_and_glx_different_pointers.c;dlwrap.c;dlwrap.h"
"${X11_LIBRARIES}" "USE_GLX" "-rdynamic")
endif ()
if (EPOXY_SUPPORT_GLX)
if (NOT APPLE)
epoxy_add_test (glx_alias_prefer_same_name
"${EPOXY_GLX_TESTS_COMMON};glx_alias_prefer_same_name.c;dlwrap.c;dlwrap.h" "${X11_LIBRARIES}"
"" "-rdynamic")
if (GLESv2_FOUND)
epoxy_add_test (test_glx_gles2
"${EPOXY_GLX_TESTS_COMMON};glx_gles2.c;dlwrap.c;dlwrap.h" "${X11_LIBRARIES}" "" "-rdynamic")
endif ()
endif ()
epoxy_add_test (test_glx_beginend "${EPOXY_GLX_TESTS_COMMON};glx_beginend.c"
"${OPENGL_gl_LIBRARY};${X11_LIBRARIES}")
epoxy_add_test (glx_public_api "${EPOXY_GLX_TESTS_COMMON};glx_public_api.c" "${X11_LIBRARIES}")
epoxy_add_test (glx_public_api_core "${EPOXY_GLX_TESTS_COMMON};glx_public_api_core.c" "${X11_LIBRARIES}")
epoxy_add_test (glx_getprocaddress_nocontext
"${EPOXY_GLX_TESTS_COMMON};glx_glxgetprocaddress_nocontext.c" "${X11_LIBRARIES}")
epoxy_add_test (glx_has_extension_nocontext "${EPOXY_GLX_TESTS_COMMON};glx_has_extension_nocontext.c"
"${X11_LIBRARIES}")
epoxy_add_test (glx_shared_znow "${EPOXY_GLX_TESTS_COMMON};glx_static.c"
"${X11_LIBRARIES}" "" "-Wl,-z,now" SHARED)
epoxy_add_test (glx_static "${EPOXY_GLX_TESTS_COMMON};glx_static.c"
"${X11_LIBRARIES}" "NEEDS_TO_BE_STATIC" "" STATIC)
endif ()
epoxy_add_test (headerguards headerguards.c)
epoxy_add_test (miscdefines miscdefines.c)
if (EPOXY_SUPPORT_WGL)
epoxy_add_test (wgl_core_and_exts "${EPOXY_WGL_TESTS_COMMON};wgl_core_and_exts.c")
epoxy_add_test (wgl_per_context_funcptrs "${EPOXY_WGL_TESTS_COMMON};wgl_per_context_funcptrs.c")
epoxy_add_test (wgl_usefontbitmaps_ascii "${EPOXY_WGL_TESTS_COMMON};wgl_usefontbitmaps.c")
epoxy_add_test (wgl_usefontbitmaps_unicode "${EPOXY_WGL_TESTS_COMMON};wgl_usefontbitmaps.c"
"" "_UNICODE;UNICODE")
endif ()
endif ()

@ -83,12 +83,14 @@ override_GLES2_glGetString(GLenum e)
GLuint
override_GL_glCreateShader(GLenum type)
{
EPOXY_UNUSED(type);
return GL_CREATESHADER_VALUE;
}
GLuint
override_GLES2_glCreateShader(GLenum type)
{
EPOXY_UNUSED(type);
return GLES2_CREATESHADER_VALUE;
}
@ -207,8 +209,7 @@ init_egl(EGLDisplay *out_dpy, EGLContext *out_ctx)
}
#endif /* USE_EGL */
int
main(int argc, char **argv)
int main(void)
{
bool pass = true;
#ifdef USE_EGL

@ -109,8 +109,7 @@ init_egl(EGLDisplay *out_dpy, EGLContext *out_ctx)
*out_ctx = ctx;
}
int
main(int argc, char **argv)
int main(void)
{
bool pass = true;
EGLDisplay egl_dpy;

@ -38,8 +38,7 @@
#include "egl_common.h"
int
main(int argc, char **argv)
int main(void)
{
bool pass = true;

@ -87,8 +87,7 @@ override_eglGetError(void)
return real_eglGetError();
}
int
main(int argc, char **argv)
int main(void)
{
bool pass = true;
EGLDisplay dpy = get_egl_display_or_skip();

@ -53,17 +53,18 @@ override_GL_glBindTextureEXT(GLenum target);
void
override_GL_glBindTexture(GLenum target)
{
EPOXY_UNUSED(target);
last_call = CORE_FUNC_VAL;
}
void
override_GL_glBindTextureEXT(GLenum target)
{
EPOXY_UNUSED(target);
last_call = EXT_FUNC_VAL;
}
int
main(int argc, char **argv)
int main(void)
{
bool pass = true;

@ -89,8 +89,7 @@ test_without_epoxy(void)
return true;
}
int
main(int argc, char **argv)
int main(void)
{
bool pass = true;

@ -72,6 +72,8 @@ get_glx_window(Display *dpy, XVisualInfo *visinfo, bool map)
Window root_win = RootWindow(dpy, screen);
Window win;
EPOXY_UNUSED(map);
window_attr.background_pixel = 0;
window_attr.border_pixel = 0;
window_attr.colormap = XCreateColormap(dpy, root_win,
@ -119,7 +121,7 @@ get_fbconfig_for_visinfo(Display *dpy, XVisualInfo *visinfo)
if (glXGetFBConfigAttrib(dpy, configs[i], GLX_VISUAL_ID, &v))
continue;
if (v == visinfo->visualid) {
if (v == (int)visinfo->visualid) {
ret = configs[i];
break;
}

@ -46,6 +46,7 @@ override_GLES2_glCreateShader(GLenum target);
GLuint
override_GLES2_glCreateShader(GLenum target)
{
EPOXY_UNUSED(target);
return 0;
}
@ -60,8 +61,7 @@ override_GLES2_glGenQueries(GLsizei n, GLuint *ids)
ids[i] = 0;
}
int
main(int argc, char **argv)
int main(void)
{
bool pass = true;
XVisualInfo *vis;

@ -39,8 +39,7 @@
static Display *dpy;
int
main(int argc, char **argv)
int main(void)
{
bool pass = true;
void *func;

@ -39,8 +39,7 @@
static Display *dpy;
int
main(int argc, char **argv)
int main(void)
{
bool pass = true;

@ -107,8 +107,7 @@ test_glx_extension_supported(void)
return true;
}
int
main(int argc, char **argv)
int main(void)
{
bool pass = true;

@ -130,8 +130,7 @@ test_glx_version(void)
return true;
}
int
main(int argc, char **argv)
int main(void)
{
bool pass = true;
XVisualInfo *visinfo;

@ -42,8 +42,7 @@
#include "glx_common.h"
int
main(int argc, char **argv)
int main(void)
{
bool pass = true;
int val;

@ -21,40 +21,31 @@
* IN THE SOFTWARE.
*/
#include <config.h>
#include <epoxy/gl.h>
#ifdef BUILD_EGL
#include <epoxy/egl.h>
#include <epoxy/egl.h>
#endif
#ifdef BUILD_GLX
#include <epoxy/glx.h>
#include <epoxy/glx.h>
#if EPOXY_SUPPORT_EGL
#include <epoxy/egl.h>
#include <epoxy/egl.h>
#endif
#ifdef BUILD_EGL
#include <EGL/egl.h>
#include <EGL/egl.h>
#include <EGL/eglext.h>
#include <EGL/eglext.h>
#if EPOXY_SUPPORT_GLX
#include <epoxy/glx.h>
#include <epoxy/glx.h>
#endif
#ifdef BUILD_GLX
#ifdef __APPLE__
#include <OpenGL/gl.h>
#include <OpenGL/glext.h>
#else
#include <GL/gl.h>
#include <GL/glext.h>
#endif
#include <GL/glx.h>
#include <GL/glxext.h>
#if EPOXY_SUPPORT_GLX
#ifdef __APPLE__
#include <OpenGL/gl.h>
#include <OpenGL/glext.h>
#else
#include <GL/gl.h>
#include <GL/glext.h>
#endif
#include <GL/glx.h>
#include <GL/glxext.h>
#endif
int main(int argc, char **argv)
int main(void)
{
return 0;
}

@ -24,12 +24,9 @@
#include <stdio.h>
#include <stdlib.h>
#include "config.h"
#include "khronos_typedefs.h"
#ifdef HAVE_KHRPLATFORM_H
#include <KHR/khrplatform.h>
#include "epoxy/khrplatform.h"
#define GET_SIZE(type) sizes[type ## _slot] = sizeof(type)
@ -53,19 +50,3 @@ get_system_typedef_sizes(uint32_t *sizes)
GET_SIZE(khronos_stime_nanoseconds_t);
GET_SIZE(khronos_boolean_enum_t);
}
#else /* !HAVE_KHRPLATFORM_H */
#ifndef _MSC_VER
/* Don't care -- this is a conditional case in test code. */
#pragma GCC diagnostic ignored "-Wsuggest-attribute=noreturn"
#endif
void
get_system_typedef_sizes(uint32_t *sizes)
{
fprintf(stderr, "./configure failed to find khrplatform.h\n");
exit(77);
}
#endif

@ -23,11 +23,11 @@
#include <epoxy/gl.h>
#ifdef BUILD_EGL
#if EPOXY_SUPPORT_EGL
#include <epoxy/egl.h>
#endif
#ifdef BUILD_GLX
#if EPOXY_SUPPORT_GLX
#include <epoxy/glx.h>
#endif
@ -61,7 +61,7 @@
/* Do we want to export GL_GLEXT_VERSION? */
int main(int argc, char **argv)
int main(void)
{
return 0;
}

@ -85,8 +85,8 @@ window_proc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
void
make_window_and_test(int (*callback)(HDC hdc))
{
const char *class_name = "epoxy";
const char *window_name = "epoxy";
LPCTSTR class_name = TEXT("epoxy");
LPCTSTR window_name = TEXT("epoxy");
int width = 150;
int height = 150;
HWND hwnd;

@ -21,7 +21,6 @@
* IN THE SOFTWARE.
*/
#include <config.h>
#include <stdio.h>
#include "wgl_common.h"
@ -71,8 +70,7 @@ test_function(HDC hdc)
return !pass;
}
int
main(int argc, char **argv)
int main()
{
make_window_and_test(test_function);

@ -35,7 +35,6 @@
* regardless.
*/
#include <config.h>
#include <stdio.h>
#include <assert.h>
@ -57,6 +56,7 @@ OVERRIDE_API (PROC) override_wglGetProcAddress(LPCSTR name);
OVERRIDE_API (GLuint)
override_glCreateShader_ctx1(GLenum target)
{
EPOXY_UNUSED(target);
if (current_context != ctx1) {
fprintf(stderr, "ctx1 called while other context current\n");
pass = false;
@ -67,6 +67,7 @@ override_glCreateShader_ctx1(GLenum target)
OVERRIDE_API (GLuint)
override_glCreateShader_ctx2(GLenum target)
{
EPOXY_UNUSED(target);
if (current_context != ctx2) {
fprintf(stderr, "ctx2 called while other context current\n");
pass = false;
@ -156,8 +157,7 @@ test_function(HDC hdc)
return !pass;
}
int
main(int argc, char **argv)
int main()
{
make_window_and_test(test_function);

@ -21,7 +21,6 @@
* IN THE SOFTWARE.
*/
#include <config.h>
#include <stdio.h>
#include "wgl_common.h"
@ -48,7 +47,7 @@ test_function(HDC hdc)
/* First, use the #ifdeffed variant of the function */
wglUseFontBitmaps(hdc, 0, 255, dlist[1]);
glListBase(dlist[1]);
glCallLists(strlen(string), GL_UNSIGNED_BYTE, string);
glCallLists((GLsizei)strlen(string), GL_UNSIGNED_BYTE, string);
/* Now, use the specific version, manually. */
#ifdef UNICODE
@ -57,7 +56,7 @@ test_function(HDC hdc)
wglUseFontBitmapsA(hdc, 0, 255, dlist[2]);
#endif
glListBase(dlist[2]);
glCallLists(strlen(string), GL_UNSIGNED_BYTE, string);
glCallLists((GLsizei)strlen(string), GL_UNSIGNED_BYTE, string);
wglMakeCurrent(NULL, NULL);
wglDeleteContext(ctx);
@ -65,8 +64,7 @@ test_function(HDC hdc)
return !pass;
}
int
main(int argc, char **argv)
int main()
{
make_window_and_test(test_function);

Loading…
Cancel
Save