diff --git a/Makefile b/Makefile index 911a3c6..e45d3c4 100644 --- a/Makefile +++ b/Makefile @@ -39,6 +39,7 @@ include Makefile.dreamtorus include Makefile.dreamtorus_static include Makefile.alphatorus include Makefile.tiger +include Makefile.nacl # Testing diff --git a/Makefile.nacl b/Makefile.nacl index e5fa8f8..edbe578 100644 --- a/Makefile.nacl +++ b/Makefile.nacl @@ -6,6 +6,7 @@ MAKEFILE_NACL_INCLUDED := 1 # ifneq ($(filter nacl%,$(SYSTEM)),) +ifeq ($(filter nacl-pnacl,$(SYSTEM)),) .PHONY: nacl.bin nacl.clean @@ -36,8 +37,9 @@ NACL.SRCS.NAMES := $(notdir $(NACL.SRCS)) NACL.OBJS := $(addprefix tmp/$(SYSTEM)/nacl/static/,$(NACL.SRCS.NAMES)) NACL.OBJS := $(NACL.OBJS:.c=.o) NACL.CFLAGS := -Iinclude -NACL.LIBS += -Llib/$(SYSTEM) -lRegal -NACL.LIBS += -lpng -lz -lm -pthread -lppapi -lppapi_gles2 -lstdc++ +NACL.CFLAGS += -DREGAL_NAMESPACE=1 +NACL.LIBS += -Llib/$(SYSTEM) -lRegallib -lglslopt -lpnglib -lzlib +NACL.LIBS += -lm -pthread -lppapi -lppapi_gles2 -lstdc++ -include $(NACL.DEPS) @@ -45,7 +47,7 @@ tmp/$(SYSTEM)/nacl/static/%.o: examples/nacl/%.c @mkdir -p $(dir $@) $(LOG_CC)$(CC) $(CFLAGS) -std=gnu99 $(NACL.CFLAGS) $(CFLAGS.SO) -o $@ -c $< -bin/$(SYSTEM)/nacl$(BIN_EXTENSION): lib/$(SYSTEM)/$(REGAL.STATIC) $(NACL.OBJS) +bin/$(SYSTEM)/nacl$(BIN_EXTENSION): lib/$(SYSTEM)/$(REGAL.STATIC) lib/$(SYSTEM)/$(GLSLOPT.STATIC) $(NACL.OBJS) @mkdir -p $(dir $@) $(LOG_LD)$(LD) $(LDFLAGS.EXTRA) -o $@ $(NACL.OBJS) $(NACL.LIBS) ifneq ($(STRIP),) @@ -57,3 +59,4 @@ examples/nacl/nacl.nmf: bin/$(SYSTEM)/nacl$(BIN_EXTENSION) endif endif +endif diff --git a/Makefile.regal b/Makefile.regal index 04a1c88..a203e61 100644 --- a/Makefile.regal +++ b/Makefile.regal @@ -35,7 +35,13 @@ all:: regal.lib clean:: regal.clean -REGAL.LDFLAGS := -lstdc++ -pthread -lm +REGAL.LDFLAGS := + +ifeq ($(filter nacl%,$(SYSTEM)),) +REGAL.LDFLAGS += -lstdc++ +endif + +REGAL.LDFLAGS += -pthread -lm REGAL.LIBS := ifeq ($(filter nacl%,$(SYSTEM)),) @@ -103,16 +109,16 @@ endif ifeq ($(MODE),custom) endif -# Emscripten options +# NaCL options -ifneq ($(filter nacl% emscripten%,$(SYSTEM)),) -REGAL.CFLAGS += -DREGAL_SYS_EMSCRIPTEN=1 -DREGAL_SYS_EGL=1 -DREGAL_SYS_ES2=1 -REGAL.CFLAGS += -DREGAL_HTTP=0 +ifneq ($(filter nacl%,$(SYSTEM)),) +REGAL.CFLAGS += -DREGAL_SYS_ES2=1 +REGAL.CFLAGS += -DREGAL_HTTP=0 REGAL.CFLAGS += -DREGAL_STATISTICS=0 REGAL.CFLAGS += -Wno-constant-logical-operand REGAL.CFLAGS += -DREGAL_PLUGIN=0 REGAL.CFLAGS += -DREGAL_TRACE=0 -REGAL.CFLAGS += -DREGAL_NAMESPACE=1 -DREGAL_STATIC_ES2 -DREGAL_STATIC_EGL +REGAL.CFLAGS += -DREGAL_NAMESPACE=1 -DREGAL_STATIC_ES2 REGAL_LOG = 0 REGAL_NO_TLS = 1 diff --git a/Makefile.regaltest b/Makefile.regaltest index fdebf3a..a4e7304 100644 --- a/Makefile.regaltest +++ b/Makefile.regaltest @@ -5,9 +5,9 @@ MAKEFILE_REGALTEST_INCLUDED := 1 include build/common.inc -# Not supported for NaCL - Revisit +# Not supported for Emscripten - Revisit -ifeq ($(filter nacl% emscripten%,$(SYSTEM)),) +ifeq ($(filter emscripten% nacl-pnacl,$(SYSTEM)),) include build/regaltest.inc @@ -49,7 +49,7 @@ REGALTEST.LIBS := -Llib/$(SYSTEM) $(LDFLAGS.X11) -lm ifeq ($(filter nacl%,$(SYSTEM)),) REGALTEST.LIBS += -ldl else -REGALTEST.LIBS += -lnacl_io +REGALTEST.LIBS += -lnacl_io -lppapi -lppapi_gles2 endif -include $(REGALTEST.DEPS) @@ -61,9 +61,9 @@ tmp/$(SYSTEM)/regaltest/static/%.o: tests/%.cpp bin/$(SYSTEM)/regaltest$(BIN_EXTENSION): $(REGALTEST.OBJS) lib/$(SYSTEM)/$(GTEST.STATIC) lib/$(SYSTEM)/$(REGAL.STATIC) lib/$(SYSTEM)/$(PCRE.STATIC) $(REGAL.SHARED.DEPEND) @mkdir -p $(dir $@) ifdef APITRACE.STATIC - $(LOG_LD)$(CCACHE) $(LD) $(LDFLAGS.EXTRA) -o $@ $(REGALTEST.OBJS) $(REGALTEST.LIBS) $(LDFLAGS.STARTGROUP) lib/$(SYSTEM)/$(REGAL.STATIC) lib/$(SYSTEM)/$(APITRACE.STATIC) $(LDFLAGS.ENDGROUP) $(REGAL.SHARED.DEPEND) $(REGAL.LIBS) lib/$(SYSTEM)/$(PCRE.STATIC) lib/$(SYSTEM)/$(GTEST.STATIC) $(REGAL.LDFLAGS) + $(LOG_LD)$(CCACHE) $(LD) $(LDFLAGS.EXTRA) -o $@ $(REGALTEST.OBJS) $(LDFLAGS.STARTGROUP) lib/$(SYSTEM)/$(REGAL.STATIC) lib/$(SYSTEM)/$(APITRACE.STATIC) $(LDFLAGS.ENDGROUP) $(REGAL.SHARED.DEPEND) $(REGAL.LIBS) $(REGALTEST.LIBS) lib/$(SYSTEM)/$(PCRE.STATIC) lib/$(SYSTEM)/$(GTEST.STATIC) $(REGAL.LDFLAGS) else - $(LOG_LD)$(CCACHE) $(LD) $(LDFLAGS.EXTRA) -o $@ $(REGALTEST.OBJS) $(REGALTEST.LIBS) lib/$(SYSTEM)/$(REGAL.STATIC) lib/$(SYSTEM)/$(PCRE.STATIC) $(REGAL.SHARED.DEPEND) $(REGAL.LIBS) lib/$(SYSTEM)/$(GTEST.STATIC) $(REGAL.LDFLAGS) + $(LOG_LD)$(CCACHE) $(LD) $(LDFLAGS.EXTRA) -o $@ $(REGALTEST.OBJS) lib/$(SYSTEM)/$(REGAL.STATIC) lib/$(SYSTEM)/$(PCRE.STATIC) $(REGAL.SHARED.DEPEND) $(REGAL.LIBS) $(REGALTEST.LIBS) lib/$(SYSTEM)/$(GTEST.STATIC) $(REGAL.LDFLAGS) endif ifneq ($(STRIP),) $(LOG_STRIP)$(STRIP) -x $@ @@ -75,7 +75,7 @@ test: bin/$(SYSTEM)/regaltest$(BIN_EXTENSION) ifeq ($(filter nacl%,$(SYSTEM)),) $^ else - "$(NACL_SEL_LDR)" -a -B "$(NACL_IRT)" -- $^ + "$(NACL_SDK_ROOT)/tools/sel_ldr.py" $^ endif endif diff --git a/README.rst b/README.rst index a8d5d84..600c336 100644 --- a/README.rst +++ b/README.rst @@ -380,9 +380,7 @@ PPAPI and NaCl * NACL_SDK_ROOT needs to be set -* NACL_LIBC=newlib is the default, specify NACL_LIBC=glibc as an alternative - -* regaltest requires pepper_26 or newer +* NACL_LIBC=newlib is the default, specify glibc or pnacl as alternatives Questions and Answers ===================== diff --git a/build/common.inc b/build/common.inc index 6049b68..5ae16e0 100644 --- a/build/common.inc +++ b/build/common.inc @@ -51,12 +51,12 @@ OPT ?= $(CFLAGS.RELEASE) endif ifndef V -LOG_CXX ?= @echo " [CXX] $@"; -LOG_CC ?= @echo " [CC] $@"; -LOG_LD ?= @echo " [LD] $@"; -LOG_AR ?= @echo " [AR] $@"; +LOG_CXX ?= @echo " [CXX] $@"; +LOG_CC ?= @echo " [CC] $@"; +LOG_LD ?= @echo " [LD] $@"; +LOG_AR ?= @echo " [AR] $@"; LOG_RANLIB ?= @echo " [RANLIB] $@"; -LOG_STRIP ?= @echo " [STRIP] $@"; +LOG_STRIP ?= @echo " [STRIP] $@"; endif INCLUDE ?= -Iinclude diff --git a/build/glslopt.inc b/build/glslopt.inc index bb4b68d..624d7df 100644 --- a/build/glslopt.inc +++ b/build/glslopt.inc @@ -93,15 +93,14 @@ GLSLOPT.CXX += src/glsl/src/glsl/../mesa/program/symbol_table.c GLSLOPT.CXX += src/glsl/src/glsl/../mesa/program/prog_hash_table.c # Internal Headers -# seth: is this used for dependencies? GLSLOPT.H := # Other Headers -# seth: do all of these need to be specified? GLSLOPT.H.OTHER := # # Includes +# GLSLOPT.INCLUDE := GLSLOPT.INCLUDE += -Isrc/glsl/include diff --git a/build/pcre.inc b/build/pcre.inc index d253c38..7a941c6 100644 --- a/build/pcre.inc +++ b/build/pcre.inc @@ -65,7 +65,7 @@ PCRE.C += src/pcre/pcre_get.c PCRE.C += src/pcre/pcre_globals.c #PCRE.C += src/pcre/pcregrep.c PCRE.C += src/pcre/pcre_jit_compile.c -PCRE.C += src/pcre/pcre_jit_test.c +#PCRE.C += src/pcre/pcre_jit_test.c PCRE.C += src/pcre/pcre_maketables.c PCRE.C += src/pcre/pcre_newline.c PCRE.C += src/pcre/pcre_ord2utf8.c diff --git a/config/Makefile.linux-clang b/config/Makefile.linux-clang new file mode 100644 index 0000000..cfd361d --- /dev/null +++ b/config/Makefile.linux-clang @@ -0,0 +1,9 @@ +# Use clang 3.5 toolchain on Ubuntu 14.04 / Debian + +include config/Makefile.linux + +CC = clang +CXX = clang++ +LD = clang + +WARN += -Wno-constant-logical-operand diff --git a/config/Makefile.linux-gcc44 b/config/Makefile.linux-gcc44 new file mode 100644 index 0000000..e65456f --- /dev/null +++ b/config/Makefile.linux-gcc44 @@ -0,0 +1,7 @@ +# Use gcc 4.4 toolchain on Ubuntu 14.04 / Debian + +include config/Makefile.linux + +CC = gcc-4.4 +CXX = g++-4.4 +LD = gcc-4.4 diff --git a/config/Makefile.linux-gcc46 b/config/Makefile.linux-gcc46 new file mode 100644 index 0000000..1b8e904 --- /dev/null +++ b/config/Makefile.linux-gcc46 @@ -0,0 +1,7 @@ +# Use gcc 4.6 toolchain on Ubuntu 14.04 / Debian + +include config/Makefile.linux + +CC = gcc-4.6 +CXX = g++-4.6 +LD = gcc-4.6 diff --git a/config/Makefile.nacl-pnacl b/config/Makefile.nacl-pnacl index a0ee95c..9bfbe1d 100644 --- a/config/Makefile.nacl-pnacl +++ b/config/Makefile.nacl-pnacl @@ -2,7 +2,7 @@ NACL_ARCH := pnacl include config/nacl.inc -NACL_TOOLCHAIN := $(NACL_SDK_ROOT)/toolchain/$(NACL_OS)_x86_pnacl/$(NACL_LIBC) +NACL_TOOLCHAIN := $(NACL_SDK_ROOT)/toolchain/$(NACL_OS)_pnacl CC := $(NACL_TOOLCHAIN)/bin/pnacl-clang CXX := $(NACL_TOOLCHAIN)/bin/pnacl-clang++ @@ -13,7 +13,6 @@ STRIP ?= BIN_EXTENSION = .pexe EXT.DYNAMIC = so -LDFLAGS.EXTRA = LIBDIR = CFLAGS.EXTRA += LDFLAGS.EXTRA += diff --git a/config/nacl.inc b/config/nacl.inc index d86d4e7..66a9b05 100644 --- a/config/nacl.inc +++ b/config/nacl.inc @@ -48,8 +48,12 @@ export CCACHE_COMPILERCHECK=echo $(SYSTEM)$(NACL_LIBC)$(NACL_SDK_ROOT) ifeq ($(NACL_ARCH),i686) NACL_LIBTYPE=$(NACL_LIBC)_x86_32 else +ifeq ($(NACL_ARCH),pnacl) +NACL_LIBTYPE=$(NACL_ARCH) +else NACL_LIBTYPE=$(NACL_LIBC)_$(NACL_ARCH) endif +endif ifeq ($(MODE),debug) LDFLAGS.EXTRA += -L$(NACL_SDK_ROOT)/ports/lib/$(NACL_LIBTYPE)/Debug diff --git a/include/GL/Regal.h b/include/GL/Regal.h index caa2b65..3040074 100644 --- a/include/GL/Regal.h +++ b/include/GL/Regal.h @@ -3,11 +3,11 @@ */ /* - Copyright (c) 2011-2013 NVIDIA Corporation + Copyright (c) 2011-2014 NVIDIA Corporation + Copyright (c) 2012-2014 Scott Nations + Copyright (c) 2012-2014 Nigel Stewart Copyright (c) 2011-2013 Cass Everitt - Copyright (c) 2012-2013 Scott Nations Copyright (c) 2012 Mathias Schott - Copyright (c) 2012-2013 Nigel Stewart Copyright (c) 2012-2013 Google Inc. All rights reserved. diff --git a/include/GL/RegalGLEW.h b/include/GL/RegalGLEW.h index b76d4ce..bee952d 100644 --- a/include/GL/RegalGLEW.h +++ b/include/GL/RegalGLEW.h @@ -1,6 +1,6 @@ /* ** The OpenGL Extension Wrangler Library -** Copyright (C) 2008-2013, Nigel Stewart +** Copyright (C) 2008-2014, Nigel Stewart ** Copyright (C) 2002-2008, Milan Ikits ** Copyright (C) 2002-2008, Marcelo E. Magallon ** Copyright (C) 2002, Lev Povalahev @@ -1184,6 +1184,15 @@ GLAPI void GLAPIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei heigh /* ---------------------------------- GLU ---------------------------------- */ +#ifndef GLEW_NO_GLU +# ifdef __APPLE__ +# include +# if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +# define GLEW_NO_GLU +# endif +# endif +#endif + #ifndef GLEW_NO_GLU /* this is where we can safely include GLU */ # if defined(__APPLE__) && defined(__MACH__) @@ -1612,18 +1621,18 @@ typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVPROC) (const GLshort *p); #ifndef GL_VERSION_1_5 #define GL_VERSION_1_5 1 -#define GL_FOG_COORD_SRC GL_FOG_COORDINATE_SOURCE +#define GL_CURRENT_FOG_COORD GL_CURRENT_FOG_COORDINATE #define GL_FOG_COORD GL_FOG_COORDINATE #define GL_FOG_COORD_ARRAY GL_FOG_COORDINATE_ARRAY -#define GL_SRC0_RGB GL_SOURCE0_RGB -#define GL_FOG_COORD_ARRAY_POINTER GL_FOG_COORDINATE_ARRAY_POINTER -#define GL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE -#define GL_SRC1_ALPHA GL_SOURCE1_ALPHA -#define GL_CURRENT_FOG_COORD GL_CURRENT_FOG_COORDINATE -#define GL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE -#define GL_SRC0_ALPHA GL_SOURCE0_ALPHA -#define GL_SRC1_RGB GL_SOURCE1_RGB #define GL_FOG_COORD_ARRAY_BUFFER_BINDING GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING +#define GL_FOG_COORD_ARRAY_POINTER GL_FOG_COORDINATE_ARRAY_POINTER +#define GL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE +#define GL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE +#define GL_FOG_COORD_SRC GL_FOG_COORDINATE_SOURCE +#define GL_SRC0_ALPHA GL_SOURCE0_ALPHA +#define GL_SRC0_RGB GL_SOURCE0_RGB +#define GL_SRC1_ALPHA GL_SOURCE1_ALPHA +#define GL_SRC1_RGB GL_SOURCE1_RGB #define GL_SRC2_ALPHA GL_SOURCE2_ALPHA #define GL_SRC2_RGB GL_SOURCE2_RGB #define GL_BUFFER_SIZE 0x8764 @@ -2044,14 +2053,14 @@ typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei #ifndef GL_VERSION_3_0 #define GL_VERSION_3_0 1 -#define GL_MAX_CLIP_DISTANCES GL_MAX_CLIP_PLANES -#define GL_CLIP_DISTANCE5 GL_CLIP_PLANE5 -#define GL_CLIP_DISTANCE1 GL_CLIP_PLANE1 -#define GL_CLIP_DISTANCE3 GL_CLIP_PLANE3 -#define GL_COMPARE_REF_TO_TEXTURE GL_COMPARE_R_TO_TEXTURE_ARB #define GL_CLIP_DISTANCE0 GL_CLIP_PLANE0 -#define GL_CLIP_DISTANCE4 GL_CLIP_PLANE4 +#define GL_CLIP_DISTANCE1 GL_CLIP_PLANE1 #define GL_CLIP_DISTANCE2 GL_CLIP_PLANE2 +#define GL_CLIP_DISTANCE3 GL_CLIP_PLANE3 +#define GL_CLIP_DISTANCE4 GL_CLIP_PLANE4 +#define GL_CLIP_DISTANCE5 GL_CLIP_PLANE5 +#define GL_COMPARE_REF_TO_TEXTURE GL_COMPARE_R_TO_TEXTURE_ARB +#define GL_MAX_CLIP_DISTANCES GL_MAX_CLIP_PLANES #define GL_MAX_VARYING_COMPONENTS GL_MAX_VARYING_FLOATS #define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x0001 #define GL_MAJOR_VERSION 0x821B @@ -2585,6 +2594,24 @@ typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC) (GLuint buf, GL #endif /* GL_AMD_draw_buffers_blend */ +/* --------------------------- GL_AMD_gcn_shader --------------------------- */ + +#ifndef GL_AMD_gcn_shader +#define GL_AMD_gcn_shader 1 + +#define GLEW_AMD_gcn_shader GLEW_GET_VAR(__GLEW_AMD_gcn_shader) + +#endif /* GL_AMD_gcn_shader */ + +/* ------------------------ GL_AMD_gpu_shader_int64 ------------------------ */ + +#ifndef GL_AMD_gpu_shader_int64 +#define GL_AMD_gpu_shader_int64 1 + +#define GLEW_AMD_gpu_shader_int64 GLEW_GET_VAR(__GLEW_AMD_gpu_shader_int64) + +#endif /* GL_AMD_gpu_shader_int64 */ + /* ---------------------- GL_AMD_interleaved_elements ---------------------- */ #ifndef GL_AMD_interleaved_elements @@ -2854,6 +2881,17 @@ typedef void (GLAPIENTRY * PFNGLSTENCILOPVALUEAMDPROC) (GLenum face, GLuint valu #endif /* GL_AMD_transform_feedback3_lines_triangles */ +/* ----------------------- GL_AMD_transform_feedback4 ---------------------- */ + +#ifndef GL_AMD_transform_feedback4 +#define GL_AMD_transform_feedback4 1 + +#define GL_STREAM_RASTERIZATION_AMD 0x91A0 + +#define GLEW_AMD_transform_feedback4 GLEW_GET_VAR(__GLEW_AMD_transform_feedback4) + +#endif /* GL_AMD_transform_feedback4 */ + /* ----------------------- GL_AMD_vertex_shader_layer ---------------------- */ #ifndef GL_AMD_vertex_shader_layer @@ -6807,6 +6845,7 @@ typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLPOINTERPROC) (GLuint index, GLint s #define GL_VERTEX_BINDING_STRIDE 0x82D8 #define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9 #define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA +#define GL_VERTEX_BINDING_BUFFER 0x8F4F typedef void (GLAPIENTRY * PFNGLBINDVERTEXBUFFERPROC) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); typedef void (GLAPIENTRY * PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); @@ -7547,13 +7586,13 @@ typedef void (GLAPIENTRY * PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint #ifndef GL_ATI_fragment_shader #define GL_ATI_fragment_shader 1 -#define GL_RED_BIT_ATI 0x00000001 #define GL_2X_BIT_ATI 0x00000001 +#define GL_RED_BIT_ATI 0x00000001 #define GL_4X_BIT_ATI 0x00000002 -#define GL_GREEN_BIT_ATI 0x00000002 #define GL_COMP_BIT_ATI 0x00000002 -#define GL_BLUE_BIT_ATI 0x00000004 +#define GL_GREEN_BIT_ATI 0x00000002 #define GL_8X_BIT_ATI 0x00000004 +#define GL_BLUE_BIT_ATI 0x00000004 #define GL_NEGATE_BIT_ATI 0x00000004 #define GL_BIAS_BIT_ATI 0x00000008 #define GL_HALF_BIT_ATI 0x00000008 @@ -9748,6 +9787,15 @@ typedef void (GLAPIENTRY * PFNGLUSESHADERPROGRAMEXTPROC) (GLenum type, GLuint pr #endif /* GL_EXT_separate_specular_color */ +/* ------------------- GL_EXT_shader_image_load_formatted ------------------ */ + +#ifndef GL_EXT_shader_image_load_formatted +#define GL_EXT_shader_image_load_formatted 1 + +#define GLEW_EXT_shader_image_load_formatted GLEW_GET_VAR(__GLEW_EXT_shader_image_load_formatted) + +#endif /* GL_EXT_shader_image_load_formatted */ + /* --------------------- GL_EXT_shader_image_load_store -------------------- */ #ifndef GL_EXT_shader_image_load_store @@ -12449,8 +12497,8 @@ typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target, #define GL_ITALIC_BIT_NV 0x02 #define GL_MOVE_TO_NV 0x02 #define GL_RELATIVE_MOVE_TO_NV 0x03 -#define GL_LINE_TO_NV 0x04 #define GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV 0x04 +#define GL_LINE_TO_NV 0x04 #define GL_RELATIVE_LINE_TO_NV 0x05 #define GL_HORIZONTAL_LINE_TO_NV 0x06 #define GL_RELATIVE_HORIZONTAL_LINE_TO_NV 0x07 @@ -12938,6 +12986,28 @@ typedef void (GLAPIENTRY * PFNGLUNIFORMUI64VNVPROC) (GLint location, GLsizei cou #endif /* GL_NV_shader_storage_buffer_object */ +/* ----------------------- GL_NV_shader_thread_group ----------------------- */ + +#ifndef GL_NV_shader_thread_group +#define GL_NV_shader_thread_group 1 + +#define GL_WARP_SIZE_NV 0x9339 +#define GL_WARPS_PER_SM_NV 0x933A +#define GL_SM_COUNT_NV 0x933B + +#define GLEW_NV_shader_thread_group GLEW_GET_VAR(__GLEW_NV_shader_thread_group) + +#endif /* GL_NV_shader_thread_group */ + +/* ---------------------- GL_NV_shader_thread_shuffle ---------------------- */ + +#ifndef GL_NV_shader_thread_shuffle +#define GL_NV_shader_thread_shuffle 1 + +#define GLEW_NV_shader_thread_shuffle GLEW_GET_VAR(__GLEW_NV_shader_thread_shuffle) + +#endif /* GL_NV_shader_thread_shuffle */ + /* ---------------------- GL_NV_tessellation_program5 ---------------------- */ #ifndef GL_NV_tessellation_program5 @@ -13086,8 +13156,8 @@ typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC) (GLuint texture #define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 #define GL_OFFSET_TEXTURE_2D_SCALE_NV 0x86E2 #define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 -#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 #define GL_OFFSET_TEXTURE_2D_BIAS_NV 0x86E3 +#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 #define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 #define GL_CONST_EYE_NV 0x86E5 #define GL_PASS_THROUGH_NV 0x86E6 @@ -14556,9 +14626,9 @@ typedef void (GLAPIENTRY * PFNGLFLUSHRASTERSGIXPROC) (void); #ifndef GL_SGIX_fog_texture #define GL_SGIX_fog_texture 1 -#define GL_TEXTURE_FOG_SGIX 0 #define GL_FOG_PATCHY_FACTOR_SGIX 0 #define GL_FRAGMENT_FOG_SGIX 0 +#define GL_TEXTURE_FOG_SGIX 0 typedef void (GLAPIENTRY * PFNGLTEXTUREFOGSGIXPROC) (GLenum pname); @@ -17722,6 +17792,8 @@ GLEW_VAR_EXPORT GLboolean __GLEW_AMD_conservative_depth; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_debug_output; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_depth_clamp_separate; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_draw_buffers_blend; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_gcn_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_gpu_shader_int64; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_interleaved_elements; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_multi_draw_indirect; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_name_gen_delete; @@ -17739,6 +17811,7 @@ GLEW_VAR_EXPORT GLboolean __GLEW_AMD_sparse_texture; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_stencil_operation_extended; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_texture_texture4; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_transform_feedback3_lines_triangles; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_transform_feedback4; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_layer; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_tessellator; GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_viewport_index; @@ -17995,6 +18068,7 @@ GLEW_VAR_EXPORT GLboolean __GLEW_EXT_scene_marker; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_secondary_color; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_separate_shader_objects; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_separate_specular_color; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_image_load_formatted; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_image_load_store; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_integer_mix; GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shadow_funcs; @@ -18117,6 +18191,8 @@ GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_counters; GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_float; GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_buffer_load; GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_storage_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_thread_group; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_thread_shuffle; GLEW_VAR_EXPORT GLboolean __GLEW_NV_tessellation_program5; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_emboss; GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_reflection; diff --git a/include/GL/RegalGLXEW.h b/include/GL/RegalGLXEW.h index 76d50c6..f757939 100644 --- a/include/GL/RegalGLXEW.h +++ b/include/GL/RegalGLXEW.h @@ -1,6 +1,6 @@ /* ** The OpenGL Extension Wrangler Library -** Copyright (C) 2008-2013, Nigel Stewart +** Copyright (C) 2008-2014, Nigel Stewart ** Copyright (C) 2002-2008, Milan Ikits ** Copyright (C) 2002-2008, Marcelo E. Magallon ** Copyright (C) 2002, Lev Povalahev @@ -201,18 +201,18 @@ typedef Display* ( * PFNGLXGETCURRENTDISPLAYPROC) (void); #ifndef GLX_VERSION_1_3 #define GLX_VERSION_1_3 1 -#define GLX_RGBA_BIT 0x00000001 #define GLX_FRONT_LEFT_BUFFER_BIT 0x00000001 +#define GLX_RGBA_BIT 0x00000001 #define GLX_WINDOW_BIT 0x00000001 #define GLX_COLOR_INDEX_BIT 0x00000002 -#define GLX_PIXMAP_BIT 0x00000002 #define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002 +#define GLX_PIXMAP_BIT 0x00000002 #define GLX_BACK_LEFT_BUFFER_BIT 0x00000004 #define GLX_PBUFFER_BIT 0x00000004 #define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008 #define GLX_AUX_BUFFERS_BIT 0x00000010 -#define GLX_CONFIG_CAVEAT 0x20 #define GLX_DEPTH_BUFFER_BIT 0x00000020 +#define GLX_CONFIG_CAVEAT 0x20 #define GLX_X_VISUAL_TYPE 0x22 #define GLX_TRANSPARENT_TYPE 0x23 #define GLX_TRANSPARENT_INDEX_VALUE 0x24 @@ -666,6 +666,19 @@ typedef int ( * PFNGLXQUERYCONTEXTINFOEXTPROC) (Display* dpy, GLXContext context #endif /* GLX_EXT_scene_marker */ +/* -------------------------- GLX_EXT_stereo_tree -------------------------- */ + +#ifndef GLX_EXT_stereo_tree +#define GLX_EXT_stereo_tree 1 + +#define GLX_STEREO_NOTIFY_EXT 0x00000000 +#define GLX_STEREO_NOTIFY_MASK_EXT 0x00000001 +#define GLX_STEREO_TREE_EXT 0x20F5 + +#define GLXEW_EXT_stereo_tree GLXEW_GET_VAR(__GLXEW_EXT_stereo_tree) + +#endif /* GLX_EXT_stereo_tree */ + /* -------------------------- GLX_EXT_swap_control ------------------------- */ #ifndef GLX_EXT_swap_control @@ -1039,10 +1052,10 @@ typedef void ( * PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC) (Display* dpy, GLXVideoC #endif /* GLX_NV_video_capture */ -/* -------------------------- GLX_NV_video_output -------------------------- */ +/* ---------------------------- GLX_NV_video_out --------------------------- */ -#ifndef GLX_NV_video_output -#define GLX_NV_video_output 1 +#ifndef GLX_NV_video_out +#define GLX_NV_video_out 1 #define GLX_VIDEO_OUT_COLOR_NV 0x20C3 #define GLX_VIDEO_OUT_ALPHA_NV 0x20C4 @@ -1069,9 +1082,9 @@ typedef int ( * PFNGLXSENDPBUFFERTOVIDEONVPROC) (Display* dpy, GLXPbuffer pbuf, #define glXReleaseVideoImageNV GLXEW_GET_FUN(__glewXReleaseVideoImageNV) #define glXSendPbufferToVideoNV GLXEW_GET_FUN(__glewXSendPbufferToVideoNV) -#define GLXEW_NV_video_output GLXEW_GET_VAR(__GLXEW_NV_video_output) +#define GLXEW_NV_video_out GLXEW_GET_VAR(__GLXEW_NV_video_out) -#endif /* GLX_NV_video_output */ +#endif /* GLX_NV_video_out */ /* -------------------------- GLX_OML_swap_method -------------------------- */ @@ -1157,10 +1170,10 @@ typedef Bool ( * PFNGLXWAITFORSBCOMLPROC) (Display* dpy, GLXDrawable drawable, i #ifndef GLX_SGIX_fbconfig #define GLX_SGIX_fbconfig 1 -#define GLX_WINDOW_BIT_SGIX 0x00000001 #define GLX_RGBA_BIT_SGIX 0x00000001 -#define GLX_PIXMAP_BIT_SGIX 0x00000002 +#define GLX_WINDOW_BIT_SGIX 0x00000001 #define GLX_COLOR_INDEX_BIT_SGIX 0x00000002 +#define GLX_PIXMAP_BIT_SGIX 0x00000002 #define GLX_SCREEN_EXT 0x800C #define GLX_DRAWABLE_TYPE_SGIX 0x8010 #define GLX_RENDER_TYPE_SGIX 0x8011 @@ -1197,8 +1210,8 @@ typedef XVisualInfo* ( * PFNGLXGETVISUALFROMFBCONFIGSGIXPROC) (Display *dpy, GLX #define GLX_HYPERPIPE_DISPLAY_PIPE_SGIX 0x00000001 #define GLX_PIPE_RECT_SGIX 0x00000001 -#define GLX_PIPE_RECT_LIMITS_SGIX 0x00000002 #define GLX_HYPERPIPE_RENDER_PIPE_SGIX 0x00000002 +#define GLX_PIPE_RECT_LIMITS_SGIX 0x00000002 #define GLX_HYPERPIPE_STEREO_SGIX 0x00000003 #define GLX_HYPERPIPE_PIXEL_AVERAGE_SGIX 0x00000004 #define GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX 80 @@ -1264,8 +1277,8 @@ typedef GLXHyperpipeNetworkSGIX * ( * PFNGLXQUERYHYPERPIPENETWORKSGIXPROC) (Disp #define GLX_FRONT_LEFT_BUFFER_BIT_SGIX 0x00000001 #define GLX_FRONT_RIGHT_BUFFER_BIT_SGIX 0x00000002 -#define GLX_PBUFFER_BIT_SGIX 0x00000004 #define GLX_BACK_LEFT_BUFFER_BIT_SGIX 0x00000004 +#define GLX_PBUFFER_BIT_SGIX 0x00000004 #define GLX_BACK_RIGHT_BUFFER_BIT_SGIX 0x00000008 #define GLX_AUX_BUFFERS_BIT_SGIX 0x00000010 #define GLX_DEPTH_BUFFER_BIT_SGIX 0x00000020 @@ -1646,6 +1659,7 @@ GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_fbconfig_packed_float; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_framebuffer_sRGB; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_import_context; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_scene_marker; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_stereo_tree; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_swap_control; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_swap_control_tear; GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_texture_from_pixmap; @@ -1667,7 +1681,7 @@ GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_present_video; GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_swap_group; GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_vertex_array_range; GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_video_capture; -GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_video_output; +GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_video_out; GLXEW_VAR_EXPORT GLboolean __GLXEW_OML_swap_method; GLXEW_VAR_EXPORT GLboolean __GLXEW_OML_sync_control; GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_blended_overlay; diff --git a/include/GL/RegalWGLEW.h b/include/GL/RegalWGLEW.h index 29f1aa7..da63e40 100644 --- a/include/GL/RegalWGLEW.h +++ b/include/GL/RegalWGLEW.h @@ -1,6 +1,6 @@ /* ** The OpenGL Extension Wrangler Library -** Copyright (C) 2008-2013, Nigel Stewart +** Copyright (C) 2008-2014, Nigel Stewart ** Copyright (C) 2002-2008, Milan Ikits ** Copyright (C) 2002-2008, Marcelo E. Magallon ** Copyright (C) 2002, Lev Povalahev diff --git a/nacl-regal.sh b/nacl-regal.sh index 0a1faad..e7a64ba 100755 --- a/nacl-regal.sh +++ b/nacl-regal.sh @@ -26,3 +26,6 @@ if [ "$NACL_LIBC" != "glibc" ]; then echo "Building ARM" make -f Makefile SYSTEM=nacl-arm $* fi + +echo "Building pnacl" +make -f Makefile SYSTEM=nacl-pnacl $* diff --git a/scripts/EmuDsa.py b/scripts/EmuDsa.py index c65853c..f8beb37 100644 --- a/scripts/EmuDsa.py +++ b/scripts/EmuDsa.py @@ -365,11 +365,7 @@ dsaFormulae = { }, 'BindVertexArray' : { 'entries' : [ 'glBindVertexArray' ], - 'impl' : [ - 'if (!_context->dsa->ShadowVao( ${arg0} )) {', - ' _dispatch.call(&_dispatch.glBindVertexArray)( ${arg0} );', - '}', - ], + 'impl' : [ '_context->dsa->ShadowVao( _context, ${arg0} ); '], }, # TODO - GL_ARB_base_instance ? 'RestoreEverything' : { diff --git a/scripts/EmuFilter.py b/scripts/EmuFilter.py index 0b49d27..30651fc 100644 --- a/scripts/EmuFilter.py +++ b/scripts/EmuFilter.py @@ -212,7 +212,12 @@ return;''' 'glDrawRangeElementsBaseVertex' : { 'entries' : [ 'glDrawRangeElementsBaseVertex' ], 'impl' : [ - 'if (REGAL_FORCE_ES2_PROFILE || !_context->info->gl_arb_draw_elements_base_vertex)', + '// WAR: Our Tegra driver GL 4 core profile supports DrawRangeElementsBaseVertex but does not', + '// advertise ARB_draw_elements_base_vertex in the extension list so here we check whether the', + '// driver has glDrawRangeElementsBaseVertex instead of looking for the extension flag.', + '// (leaving original line here, just commented out)', + '// if (REGAL_FORCE_ES2_PROFILE || !_context->info->gl_arb_draw_elements_base_vertex)', + 'if (REGAL_FORCE_ES2_PROFILE || !_context->dispatcher.driver.glDrawRangeElementsBaseVertex)', '{', ' if (basevertex==0)', ' {', @@ -222,7 +227,7 @@ return;''' ' }', ' else', ' {', - ' Warning("Regal does not support ${name} (GL_ARB_draw_elements_base_vertex extension not available) for basevertex!=0 for ES 2.0 - skipping.");', + ' Warning("Regal does not support ${name} (GL_ARB_draw_elements_base_vertex extension not available) for basevertex!=0 - skipping.");', ' return;', ' }', '}' @@ -284,7 +289,7 @@ return;''' # ARB assembly programs not supported or emulated for ES 2.0 (yet) 'GL_ARB_vertex_program' : { - 'entries' : [ 'glGenProgramsARB', 'glBindProgramARB', 'glProgramStringARB', 'glGetProgramivARB' ], + 'entries' : [ 'glGenProgramsARB', 'glBindProgramARB', 'glGetProgramivARB' ], 'impl' : [ 'if (_context->isES2())', '{', @@ -294,6 +299,20 @@ return;''' ] }, + 'glProgramStringARB' : { + 'entries' : [ 'glProgramStringARB' ], + 'impl' : [ + '// nothing to do if len <= 0 so just return', + 'if (${arg2} <= 0)', + ' return;', + 'if (_context->isES2())', + '{', + ' Warning("Regal does not support ${name} (GL_ARB_vertex_program) for ES 2.0 context - skipping.");', + ' return;', + '}' + ] + }, + # Remap GL_ARB_shader_objects to GL 2.0 API # http://www.opengl.org/registry/specs/ARB/shader_objects.txt # diff --git a/scripts/EmuGetString.py b/scripts/EmuGetString.py index f14b93a..b07c727 100644 --- a/scripts/EmuGetString.py +++ b/scripts/EmuGetString.py @@ -11,7 +11,37 @@ switch (name) case GL_VENDOR: return reinterpret_cast(_context->emuInfo->vendor.c_str()); case GL_RENDERER: return reinterpret_cast(_context->emuInfo->renderer.c_str()); case GL_VERSION: return reinterpret_cast(_context->emuInfo->version.c_str()); - case GL_EXTENSIONS: return reinterpret_cast(_context->emuInfo->extensions.c_str()); + case GL_EXTENSIONS: return reinterpret_cast(_context->extensions.c_str()); + default: + break; +}''' + }, + 'GetStringi' : { + 'entries' : [ 'glGetStringi' ], + 'impl' : ''' +// Regal interceptions +switch (name) +{ + case GL_EXTENSIONS: + { + std::set::iterator it = _context->extensionsSet.begin(); + std::advance(it, index); + return reinterpret_cast(it->c_str()); + }; + default: + break; +}''' + }, + 'Get' : { + 'entries' : [ 'glGet(Integer|Float|Double|Boolean|Integer64)v(EXT|)' ], + 'impl' : ''' +// Regal interceptions +switch (pname) +{ + case GL_NUM_EXTENSIONS: + _context->numExtensions( ${arg1} ); + return; + default: break; }''' diff --git a/scripts/EmuIff.py b/scripts/EmuIff.py index fa501f8..0462f8e 100644 --- a/scripts/EmuIff.py +++ b/scripts/EmuIff.py @@ -76,6 +76,10 @@ iffFormulae = { 'entries' : [ 'gl(SecondaryColor|Color|Normal)(2|3|4)(b|i|s|ub|ui|us)(v|)(EXT|)?' ], 'impl' : [ '_context->iff->AttrN<${m2}>( _context, _context->iff->AttrIndex( RFF2A_${m1} ), ${arg0plus} );', ], }, + 'ImmArrayElement' : { + 'entries' : [ 'glArrayElement(EXT|)' ], + 'impl' : [ '_context->iff->ProvokeElement( _context, ${arg0} );', ], + }, 'ImmTexCoord' : { 'entries' : [ 'glTexCoord(1|2|3|4)(d|f|i|s)(v|)' ], 'impl' : [ '_context->iff->Attr<${m1}>( _context, _context->iff->AttrIndex( RFF2A_TexCoord ), ${arg0plus} );', ], diff --git a/scripts/EmuQuads.py b/scripts/EmuQuads.py index 1cddc3c..4f87b21 100644 --- a/scripts/EmuQuads.py +++ b/scripts/EmuQuads.py @@ -30,9 +30,7 @@ quadsFormulae = { 'impl' : [ ''' if ( ! _context->quads->glDrawArrays( _context, ${arg0plus} ) ) { - DispatchTableGL *_next = _context->dispatcher.emulation.next(); - RegalAssert(_next); - return _next->call(&_next->glDrawArrays)( ${arg0plus} ); + _context->dispatcher.emulation.glDrawArrays( ${arg0plus} ); } ''' ], diff --git a/scripts/EmuVao.py b/scripts/EmuVao.py index 2f4c440..c2a2199 100644 --- a/scripts/EmuVao.py +++ b/scripts/EmuVao.py @@ -2,10 +2,6 @@ vaoFormulae = { # TODO - GL_ARB_base_instance ? - 'Validate' : { - 'entries' : [ 'gl(Multi|)Draw(Arrays|Element|Elements)(Instanced|Indirect|BaseVertex|InstancedBaseVertex|Array|)(ARB|EXT|AMD|ATI|APPLE|)' ], - 'prefix' : [ '// _context->vao->Validate(*_context );' ], - }, 'BufferBinding' : { 'entries' : [ 'glBindBuffer(ARB|)' ], 'prefix' : [ '_context->vao->ShadowBufferBinding( ${arg0}, ${arg1} );' ], @@ -20,7 +16,7 @@ vaoFormulae = { }, 'DeleteVertexArrays' : { 'entries' : [ 'glDeleteVertexArrays(ARB|)' ], - 'impl' : [ '_context->vao->DeleteVertexArrays( ${arg0}, ${arg1} );' ], + 'impl' : [ '_context->vao->DeleteVertexArrays( *_context, ${arg0}, ${arg1} );' ], }, 'IsVertexArray' : { 'entries' : [ 'glIsVertexArray(ARB|)' ], @@ -38,6 +34,10 @@ vaoFormulae = { 'entries' : [ 'glVertexAttribPointer(ARB|)' ], 'impl' : [ 'return _context->vao->AttribPointer(*_context, ${arg0}, ${arg1plus} );' ], }, + 'AttribIPointer' : { + 'entries' : [ 'glVertexAttribIPointer(ARB|)' ], + 'impl' : [ 'return _context->vao->AttribPointer(*_context, ${arg0}, ${arg1}, ${arg2}, GL_FALSE, ${arg3plus} );' ], + }, 'GetAttrib' : { 'entries' : [ 'glGetVertexAttrib(d|f|i|Pointer)v(ARB|)' ], 'impl' : [ '_context->vao->GetAttrib( ${arg0}, ${arg1}, ${arg2} );' ], diff --git a/scripts/Export.py b/scripts/Export.py index 62ddccb..62d06bd 100755 --- a/scripts/Export.py +++ b/scripts/Export.py @@ -56,11 +56,11 @@ from RegalDispatchTrace import * regalLicense = ''' /* - Copyright (c) 2011-2013 NVIDIA Corporation + Copyright (c) 2011-2014 NVIDIA Corporation + Copyright (c) 2012-2014 Scott Nations + Copyright (c) 2012-2014 Nigel Stewart Copyright (c) 2011-2013 Cass Everitt - Copyright (c) 2012-2013 Scott Nations Copyright (c) 2012 Mathias Schott - Copyright (c) 2012-2013 Nigel Stewart Copyright (c) 2012-2013 Google Inc. All rights reserved. diff --git a/scripts/glew2py.py b/scripts/glew2py.py new file mode 100755 index 0000000..f6fc891 --- /dev/null +++ b/scripts/glew2py.py @@ -0,0 +1,247 @@ +#!/usr/bin/python -B + +# +# Utility script for converting GLEW extension +# specifications into .py Python-format API +# database. +# +# For help: +# glew2py.py -help +# +# Example usage: +# private/glew2py.py -a gl -o gl.py ~/dev/glew/auto/extensions/gles/* + +import sys +sys.path.insert(0,'scripts/api') + +from ApiGLEW import * +from optparse import OptionParser +import re + +options = None + +# paramSplit - split a parameter into (name,type) tuple + +paramRE1 = re.compile('((const )?[a-zA-Z][a-zA-Z0-9_]*[ \*]+(const )?)(.+)(\[.*\])?') +paramRE2 = re.compile('((const )?[a-zA-Z][a-zA-Z0-9_]*)') + +def splitParam(param): + if param=='void': + return None, 'void' + m = paramRE1.match(param) + if m: + if m.group(5): + return m.group(4), '%s%s'%(m.group(1),m.group(5)) + else: + return m.group(4), m.group(1) + m = paramRE2.match(param) + if m: + return '', m.group(1) + return None, None + +def tidyNameType(name, type): + tmp = '' + if type: + for i in type: + if i=='*' and tmp[-1]!=' ' and tmp[-1]!='*': + tmp += ' *' + else: + tmp += i + + # Fixups for GLEW parsespec bugs + + if name and type and name.strip()=='GLsync' and type.strip()=='GLsync': + return 'sync','GLsync' + + if type: + tmp = tmp.strip() + if tmp=='void *': + return name, 'GLvoid *' + if tmp=='void **': + return name, 'GLvoid **' + if tmp=='const void *': + return name, 'const GLvoid *' + if tmp=='const void **': + return name, 'const GLvoid **' + if tmp.startswith('void*'): + return name, 'GLvoid *%s'%tmp[5:] + if tmp=='GLchar*': + return name, 'GLchar *' + if tmp=='const GLchar*': + return name, 'const GLchar *' + return name, tmp.strip() + else: + return name,type + +# splitFunction + +functionRE = re.compile('((const )?[a-zA-Z][a-zA-Z0-9_ ]*[ \*]+(const )?)([^\(]+)(\([^\)]*\))') + +def splitFunction(f): + m = functionRE.match(f) + if m: + return (m.group(1).strip(),m.group(4).strip(),m.group(5).strip()) + else: + return () + +# extensionToPyCode +# +# Return a tuple Python code representation of an +# extension specification: +# +# ( enums, enumsAdd, functions, functionsAdd) +# + +def extensionToPyCode(ext): + + category = ext[0] + enums = ext[3] + functions = ext[4] + + enums = [ (i.split(' ')[0].strip(), i.split(' ')[1].strip()) for i in enums ] + functions = [ splitFunction(i) for i in functions ] + + pyEnums = [] + for i in enums: + code = [] + value = i[1] + if not i[1].startswith('0x'): + try: + value = '0x%04x'%(long(value)) + except: + value = '\'%s\''%i[1] + i = ( i[0], '\'%s\''%i[1] ) + code.append( '%-45s = Enumerant(\'%s\',%s,\'%s\')'%(i[0],i[0],value,category) ) + pyEnums.append( tuple(code) ) + + pyEnumsAdd = [] + for i in enums: + code = [] + code.append( 'defines.add(%s)'%(i[0]) ) + pyEnumsAdd.append( tuple(code) ) + + pyFunctions = [] + for i in functions: + ret = i[0] + ret = tidyNameType('foo',i[0])[1] + name = i[1] + params = i[2].replace('(','').replace(')','').split(',') + params = [ j.strip() for j in params ] + params = [ splitParam(j) for j in params ] + params = [ tidyNameType(j[0],j[1]) for j in params ] + code = [] + code.append( '%s = Function(\'%s\')'%(name,name) ) + code.append( '%s.ret = Return(\'%s\')'%(name,ret) ) + for i in params: + if i[1]!=None and not (i[0]==None and i[1]=='void'): + code.append( '%s.add(Input(\'%s\',\'%s\'))'%(name,i[0],i[1]) ) + code.append( '%s.category = \'%s\''%(name,category) ) + pyFunctions.append( tuple(code) ) + + pyFunctionsAdd = [] + for i in functions: + code = [] + code.append( '%s.add(%s)'%(options.api,i[1]) ) + pyFunctionsAdd.append( tuple(code) ) + + return tuple(pyEnums), tuple(pyEnumsAdd), tuple(pyFunctions), tuple(pyFunctionsAdd) + +# +# +# + +# main + +if __name__ == "__main__": + + parser = OptionParser('usage: %prog [options] [SOURCES...]') + parser.add_option('-a', '--api', dest = 'api', help = 'API name', default = 'gl') + parser.add_option('-i', '--input', dest = 'input', metavar = 'FILE', action = 'append', help = 'input file(s) in GLEW extension format', default = []) + parser.add_option('-o', '--output', dest = 'output', metavar = 'FILE', help = 'Python output file', default = []) + (options, args) = parser.parse_args() + + options.input.extend(args) + + if not options.input: + options.input = '-' + + # Read input files, convert to list of strings, and strip line endings + + if options.input!='-': + files = [ [ j.rstrip() for j in open(i, 'r').readlines() ] for i in options.input ] + else: + files = [ j.rstrip() for j in sys.stdin.readlines() ] + + # convert to .py + # ( category, URL, namestring, ( enums ), ( functions ), (handles) , (typedefs)) + + ext = [] + for i in files: + e = readGLEWextension(i) + e = ( e[0], e[1], e[2], sorted(e[3]), sorted(e[4]), sorted(e[5]), sorted(e[6])) + ext.append(tuple([e,(extensionToPyCode(e))])) + + # output file + + if options.output: + file = open(options.output, 'w') + else: + file = sys.stdout + + print >>file, '''import Api +from Api import Api +from Api import Function, Typedef, Enum +from Api import Return, Parameter, Input, Output, InputOutput +from Api import Enumerant +from Api import Extension + +%s = Api() +defines = Enum('defines') +%s.add(defines) + +'''%(options.api,options.api) + + for i in ext: + print >>file, '# %s'%(i[0][0]) + print >>file, '' + for j in i[1][0]: + print >>file, '\n'.join(j) + print >>file, '' + for i in ext: + print >>file, '# %s'%(i[0][0]) + print >>file, '' + for j in i[1][1]: + print >>file, '\n'.join(j) + print >>file, '' + for i in ext: + print >>file, '# %s'%(i[0][0]) + print >>file, '' + for j in i[1][2]: + print >>file, '%s\n'%('\n'.join(j)) + print >>file, '' + for i in ext: + print >>file, '# %s'%(i[0][0]) + print >>file, '' + for j in i[1][3]: + print >>file, '\n'.join(j) + print >>file, '' + + # Output Extensions + for i in ext: + print >>file, '%-45s = Extension(\'%s\',\'%s\')'%(i[0][0],i[0][0],i[0][1]) + print >>file, '' + + for i in ext: + if len(i[0][4]): + print >>file, '%s.functions = [\'%s\']'%(i[0][0],'\',\''.join([j.split(' ')[1] for j in i[0][4]])) + print >>file, '' + + for i in ext: + if len(i[0][3]): + print >>file, '%s.enumerants = [\'%s\']'%(i[0][0],'\',\''.join([j.split(' ')[0] for j in i[0][3]])) + print >>file, '' + + for i in ext: + print >>file, '%s.add(%s)'%(options.api,i[0][0]) + print >>file, '' + diff --git a/scripts/regal/RegalContext.py b/scripts/regal/RegalContext.py index 32cf1e4..ec8d4d5 100755 --- a/scripts/regal/RegalContext.py +++ b/scripts/regal/RegalContext.py @@ -150,6 +150,19 @@ struct RegalContext scoped_ptr dbg; scoped_ptr info; scoped_ptr emuInfo; + std::set extensionsSet; + std::string extensions; + + + inline void numExtensions(GLboolean *params) + { + *params = !!extensionsSet.size(); + } + + template inline void numExtensions(T *params) + { + *params = static_cast(extensionsSet.size()); + } #if REGAL_STATISTICS scoped_ptr statistics; @@ -235,6 +248,9 @@ ${LICENSE} #include "RegalUtil.h" +#include +using namespace boost::print; + REGAL_GLOBAL_BEGIN #include "RegalConfig.h" @@ -370,6 +386,13 @@ ${EMU_MEMBER_INIT} http.Init( this ); #endif + if (info && emuInfo) + { + extensionsSet.insert(info->extensionsSet.begin(), info->extensionsSet.end()); + extensionsSet.insert(emuInfo->extensionsSet.begin(), emuInfo->extensionsSet.end()); + extensions = ::boost::print::detail::join(extensionsSet,std::string(" ")); + } + initialized = true; } diff --git a/scripts/regal/RegalDispatchStaticES2.py b/scripts/regal/RegalDispatchStaticES2.py index 910358f..d32ec7e 100755 --- a/scripts/regal/RegalDispatchStaticES2.py +++ b/scripts/regal/RegalDispatchStaticES2.py @@ -40,6 +40,8 @@ def generateStaticES2Source(apis, args): for api in apis: if api.name=='gl': + # undefine the glFoo macros + for function in api.functions: if not function.needsContext: continue @@ -48,6 +50,20 @@ def generateStaticES2Source(apis, args): name = function.name code += '#undef %s\n' % ( name ) + # For NaCL, define glFoo -> GLES2Foo + # This is to match GLES/gl2.h in pepper_35 + + code += '\n' + code += '#if REGAL_SYS_PPAPI\n' + for function in api.functions: + if not function.needsContext: + continue + if getattr(function,'esVersions',None)==None or 2.0 not in function.esVersions: + continue + name = function.name + code += '#define %s GLES2%s\n' % ( name, name[2:] ) + code += '#endif\n' + code += '\n' code += 'extern "C"\n' code += '{\n' diff --git a/scripts/regal/RegalEmuInfo.py b/scripts/regal/RegalEmuInfo.py index 51838f9..bbd087b 100755 --- a/scripts/regal/RegalEmuInfo.py +++ b/scripts/regal/RegalEmuInfo.py @@ -27,6 +27,9 @@ REGAL_GLOBAL_BEGIN #include #include +#include +#include +#include REGAL_GLOBAL_END diff --git a/src/apitrace/thirdparty/msinttypes/stdbool.h b/src/apitrace/thirdparty/msinttypes/stdbool.h index 99a735d..2bddfe3 100644 --- a/src/apitrace/thirdparty/msinttypes/stdbool.h +++ b/src/apitrace/thirdparty/msinttypes/stdbool.h @@ -35,7 +35,7 @@ #define bool _Bool /* For compilers that don't have the builtin _Bool type. */ -#if defined(_MSC_VER) || (__STDC_VERSION__ < 199901L && __GNUC__ < 3) +#if ((defined(_MSC_VER) && (_MSC_VER < 1800)) || (!defined(_MSC_VER) && __STDC_VERSION__ < 199901L && __GNUC__ < 3)) && !defined(_lint) typedef unsigned char _Bool; #endif diff --git a/src/boost/boost/print/detail.hpp b/src/boost/boost/print/detail.hpp index 9cb3643..ec288c4 100644 --- a/src/boost/boost/print/detail.hpp +++ b/src/boost/boost/print/detail.hpp @@ -257,14 +257,14 @@ private: // 8-bit unsigned integer -inline size_t unsigned_length(const boost::uint8_t val) +inline size_t unsigned_length_uint8(const boost::uint8_t &val) { return val<10 ? 1 : (val<100 ? 2 : 3); } // 16-bit unsigned integer -inline size_t unsigned_length(const boost::uint16_t val) +inline size_t unsigned_length_uint16(const boost::uint16_t &val) { if (val<1000) return val<10 ? 1 : (val<100 ? 2 : 3); @@ -274,7 +274,7 @@ inline size_t unsigned_length(const boost::uint16_t val) // 32-bit unsigned integer -inline size_t unsigned_length(const boost::uint32_t val) +inline size_t unsigned_length_uint32(const boost::uint32_t &val) { if (val<10000) return val<100 ? (val<10 ? 1 : 2) : (val<1000 ? 3 : 4); @@ -286,7 +286,7 @@ inline size_t unsigned_length(const boost::uint32_t val) // 64-bit unsigned integer -inline size_t unsigned_length(const boost::uint64_t val) +inline size_t unsigned_length_uint64(const boost::uint64_t &val) { if (val<100000000ll) { @@ -309,65 +309,20 @@ inline size_t unsigned_length(const boost::uint64_t val) } } -#if defined(__APPLE__) && defined(__i386) -inline size_t unsigned_length(const unsigned long val) { return unsigned_length(static_cast(val)); } -#endif +// Determine the number of digits of an unsigned integer -#if defined(__APPLE__) && defined(__x86_64) -inline size_t unsigned_length(const unsigned long val) { return unsigned_length(static_cast(val)); } -#endif - -#if defined(__APPLE__) && defined(__ppc__) -inline size_t unsigned_length(const unsigned long val) { return unsigned_length(static_cast(val)); } -#endif - -#if defined(__APPLE__) && defined(__arm__) -inline size_t unsigned_length(const unsigned long val) { return unsigned_length(static_cast(val)); } -#endif - -#if defined(__native_client__) && (defined(__i386) || defined(__x86_64) || defined(__arm__)) -inline size_t unsigned_length(const unsigned long val) { return unsigned_length(static_cast(val)); } -#endif - -#if defined(__ANDROID__) && defined(__i386__) -inline size_t unsigned_length(const unsigned long val) { return unsigned_length(static_cast(val)); } -#endif - -#if defined(__ANDROID__) && defined(__ARM_ARCH__) -inline size_t unsigned_length(const unsigned long val) { return unsigned_length(static_cast(val)); } -#endif - -#if defined(__linux) && defined(__i386) && !defined(__native_client__) && !defined(__ANDROID__) -inline size_t unsigned_length(const unsigned long val) { return unsigned_length(static_cast(val)); } -#endif - -#if defined(__linux) && defined(__x86_64) && !defined(__native_client__) && !defined(__ANDROID__) -inline size_t unsigned_length(const unsigned long long val) { return unsigned_length(static_cast(val)); } -#endif - -#if defined(__linux) && defined(__arm__) && !defined(__native_client__) && !defined(__ANDROID__) -inline size_t unsigned_length(const unsigned long val) { return unsigned_length(static_cast(val)); } -#endif - -#if (defined(__SUNPRO_C) || defined(__SUNPRO_CC) || defined(__sun)) && defined(__i386) -inline size_t unsigned_length(const unsigned int val) { return unsigned_length(static_cast(val)); } -#endif - -#if (defined(__SUNPRO_C) || defined(__SUNPRO_CC) || defined(__sun)) && defined(__x86_64) -inline size_t unsigned_length(const unsigned long val) { return unsigned_length(static_cast(val)); } -#endif - -#if defined(WIN32) && !defined(_WIN64) -inline size_t unsigned_length(const unsigned long val) { return unsigned_length(static_cast(val)); } -#endif - -#if defined(WIN32) && defined(_WIN64) -inline size_t unsigned_length(const unsigned long val) { return unsigned_length(static_cast(val)); } -#endif - -#if defined(EMSCRIPTEN) -inline size_t unsigned_length(const unsigned long val) {return unsigned_length(static_cast(val)); } -#endif +template +inline size_t unsigned_length(const U &val) +{ + switch (sizeof(U)) + { + case 1: return unsigned_length_uint8 (static_cast(val)); + case 2: return unsigned_length_uint16(static_cast(val)); + case 4: return unsigned_length_uint32(static_cast(val)); + case 8: return unsigned_length_uint64(static_cast(val)); + default: return 0; /* oops... */ + } +} // Determine the number of digits of a signed integer @@ -377,7 +332,7 @@ inline size_t signed_length(S val) const bool negative = val<0; if (negative) val = -val; - return unsigned_length(static_cast(val)) + (negative ? 1 : 0); + return unsigned_length(static_cast(val)) + (negative ? 1 : 0); } inline size_t sprintf_length(const char *fmt, ...) diff --git a/src/boost/boost/print/interface.hpp b/src/boost/boost/print/interface.hpp index 01d981f..29b93c2 100644 --- a/src/boost/boost/print/interface.hpp +++ b/src/boost/boost/print/interface.hpp @@ -155,11 +155,11 @@ using ::boost::print::detail::write_iterator; inline size_t length(bool val) { return val ? 4 : 5; /* true or false */ } -inline size_t length(unsigned char val) { return unsigned_length(val); } -inline size_t length(unsigned short val) { return unsigned_length(val); } -inline size_t length(unsigned int val) { return unsigned_length(val); } -inline size_t length(unsigned long val) { return unsigned_length(val); } -inline size_t length(unsigned long long val) { return unsigned_length(val); } +inline size_t length(unsigned char val) { return unsigned_length(val); } +inline size_t length(unsigned short val) { return unsigned_length(val); } +inline size_t length(unsigned int val) { return unsigned_length(val); } +inline size_t length(unsigned long val) { return unsigned_length(val); } +inline size_t length(unsigned long long val) { return unsigned_length(val); } inline size_t length(signed char val) { return signed_length(val); } inline size_t length(signed short val) { return signed_length(val); } diff --git a/src/glew/include/GL/glew.h b/src/glew/include/GL/glew.h index d2ccff9..bee952d 100644 --- a/src/glew/include/GL/glew.h +++ b/src/glew/include/GL/glew.h @@ -1,6 +1,6 @@ /* ** The OpenGL Extension Wrangler Library -** Copyright (C) 2008-2013, Nigel Stewart +** Copyright (C) 2008-2014, Nigel Stewart ** Copyright (C) 2002-2008, Milan Ikits ** Copyright (C) 2002-2008, Marcelo E. Magallon ** Copyright (C) 2002, Lev Povalahev @@ -1621,20 +1621,20 @@ typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVPROC) (const GLshort *p); #ifndef GL_VERSION_1_5 #define GL_VERSION_1_5 1 -#define GL_SRC1_RGB GL_SOURCE1_RGB -#define GL_FOG_COORD GL_FOG_COORDINATE -#define GL_SRC2_ALPHA GL_SOURCE2_ALPHA -#define GL_FOG_COORD_ARRAY_BUFFER_BINDING GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING -#define GL_SRC2_RGB GL_SOURCE2_RGB -#define GL_SRC1_ALPHA GL_SOURCE1_ALPHA #define GL_CURRENT_FOG_COORD GL_CURRENT_FOG_COORDINATE -#define GL_FOG_COORD_SRC GL_FOG_COORDINATE_SOURCE -#define GL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE +#define GL_FOG_COORD GL_FOG_COORDINATE #define GL_FOG_COORD_ARRAY GL_FOG_COORDINATE_ARRAY -#define GL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE -#define GL_SRC0_RGB GL_SOURCE0_RGB -#define GL_SRC0_ALPHA GL_SOURCE0_ALPHA +#define GL_FOG_COORD_ARRAY_BUFFER_BINDING GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING #define GL_FOG_COORD_ARRAY_POINTER GL_FOG_COORDINATE_ARRAY_POINTER +#define GL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE +#define GL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE +#define GL_FOG_COORD_SRC GL_FOG_COORDINATE_SOURCE +#define GL_SRC0_ALPHA GL_SOURCE0_ALPHA +#define GL_SRC0_RGB GL_SOURCE0_RGB +#define GL_SRC1_ALPHA GL_SOURCE1_ALPHA +#define GL_SRC1_RGB GL_SOURCE1_RGB +#define GL_SRC2_ALPHA GL_SOURCE2_ALPHA +#define GL_SRC2_RGB GL_SOURCE2_RGB #define GL_BUFFER_SIZE 0x8764 #define GL_BUFFER_USAGE 0x8765 #define GL_QUERY_COUNTER_BITS 0x8864 @@ -2053,15 +2053,15 @@ typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei #ifndef GL_VERSION_3_0 #define GL_VERSION_3_0 1 -#define GL_MAX_CLIP_DISTANCES GL_MAX_CLIP_PLANES -#define GL_CLIP_DISTANCE2 GL_CLIP_PLANE2 -#define GL_CLIP_DISTANCE5 GL_CLIP_PLANE5 -#define GL_MAX_VARYING_COMPONENTS GL_MAX_VARYING_FLOATS -#define GL_CLIP_DISTANCE1 GL_CLIP_PLANE1 -#define GL_COMPARE_REF_TO_TEXTURE GL_COMPARE_R_TO_TEXTURE_ARB -#define GL_CLIP_DISTANCE3 GL_CLIP_PLANE3 #define GL_CLIP_DISTANCE0 GL_CLIP_PLANE0 +#define GL_CLIP_DISTANCE1 GL_CLIP_PLANE1 +#define GL_CLIP_DISTANCE2 GL_CLIP_PLANE2 +#define GL_CLIP_DISTANCE3 GL_CLIP_PLANE3 #define GL_CLIP_DISTANCE4 GL_CLIP_PLANE4 +#define GL_CLIP_DISTANCE5 GL_CLIP_PLANE5 +#define GL_COMPARE_REF_TO_TEXTURE GL_COMPARE_R_TO_TEXTURE_ARB +#define GL_MAX_CLIP_DISTANCES GL_MAX_CLIP_PLANES +#define GL_MAX_VARYING_COMPONENTS GL_MAX_VARYING_FLOATS #define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x0001 #define GL_MAJOR_VERSION 0x821B #define GL_MINOR_VERSION 0x821C @@ -4147,8 +4147,8 @@ typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC) (GLuint frame #define GL_TEXTURE_STENCIL_SIZE 0x88F1 #define GL_UNSIGNED_NORMALIZED 0x8C17 #define GL_SRGB 0x8C40 -#define GL_FRAMEBUFFER_BINDING 0x8CA6 #define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_FRAMEBUFFER_BINDING 0x8CA6 #define GL_RENDERBUFFER_BINDING 0x8CA7 #define GL_READ_FRAMEBUFFER 0x8CA8 #define GL_DRAW_FRAMEBUFFER 0x8CA9 @@ -7588,12 +7588,12 @@ typedef void (GLAPIENTRY * PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint #define GL_2X_BIT_ATI 0x00000001 #define GL_RED_BIT_ATI 0x00000001 -#define GL_GREEN_BIT_ATI 0x00000002 -#define GL_COMP_BIT_ATI 0x00000002 #define GL_4X_BIT_ATI 0x00000002 +#define GL_COMP_BIT_ATI 0x00000002 +#define GL_GREEN_BIT_ATI 0x00000002 #define GL_8X_BIT_ATI 0x00000004 -#define GL_NEGATE_BIT_ATI 0x00000004 #define GL_BLUE_BIT_ATI 0x00000004 +#define GL_NEGATE_BIT_ATI 0x00000004 #define GL_BIAS_BIT_ATI 0x00000008 #define GL_HALF_BIT_ATI 0x00000008 #define GL_QUARTER_BIT_ATI 0x00000010 @@ -12491,19 +12491,19 @@ typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target, #define GL_NV_path_rendering 1 #define GL_CLOSE_PATH_NV 0x00 -#define GL_GLYPH_WIDTH_BIT_NV 0x01 #define GL_BOLD_BIT_NV 0x01 +#define GL_GLYPH_WIDTH_BIT_NV 0x01 #define GL_GLYPH_HEIGHT_BIT_NV 0x02 -#define GL_MOVE_TO_NV 0x02 #define GL_ITALIC_BIT_NV 0x02 +#define GL_MOVE_TO_NV 0x02 #define GL_RELATIVE_MOVE_TO_NV 0x03 #define GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV 0x04 #define GL_LINE_TO_NV 0x04 #define GL_RELATIVE_LINE_TO_NV 0x05 #define GL_HORIZONTAL_LINE_TO_NV 0x06 #define GL_RELATIVE_HORIZONTAL_LINE_TO_NV 0x07 -#define GL_VERTICAL_LINE_TO_NV 0x08 #define GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV 0x08 +#define GL_VERTICAL_LINE_TO_NV 0x08 #define GL_RELATIVE_VERTICAL_LINE_TO_NV 0x09 #define GL_QUADRATIC_CURVE_TO_NV 0x0A #define GL_RELATIVE_QUADRATIC_CURVE_TO_NV 0x0B @@ -13154,8 +13154,8 @@ typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC) (GLuint texture #define GL_CULL_MODES_NV 0x86E0 #define GL_OFFSET_TEXTURE_2D_MATRIX_NV 0x86E1 #define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 -#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 #define GL_OFFSET_TEXTURE_2D_SCALE_NV 0x86E2 +#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 #define GL_OFFSET_TEXTURE_2D_BIAS_NV 0x86E3 #define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 #define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 @@ -14626,9 +14626,9 @@ typedef void (GLAPIENTRY * PFNGLFLUSHRASTERSGIXPROC) (void); #ifndef GL_SGIX_fog_texture #define GL_SGIX_fog_texture 1 -#define GL_TEXTURE_FOG_SGIX 0 -#define GL_FRAGMENT_FOG_SGIX 0 #define GL_FOG_PATCHY_FACTOR_SGIX 0 +#define GL_FRAGMENT_FOG_SGIX 0 +#define GL_TEXTURE_FOG_SGIX 0 typedef void (GLAPIENTRY * PFNGLTEXTUREFOGSGIXPROC) (GLenum pname); diff --git a/src/glew/include/GL/glxew.h b/src/glew/include/GL/glxew.h index edb7651..f757939 100644 --- a/src/glew/include/GL/glxew.h +++ b/src/glew/include/GL/glxew.h @@ -1,6 +1,6 @@ /* ** The OpenGL Extension Wrangler Library -** Copyright (C) 2008-2013, Nigel Stewart +** Copyright (C) 2008-2014, Nigel Stewart ** Copyright (C) 2002-2008, Milan Ikits ** Copyright (C) 2002-2008, Marcelo E. Magallon ** Copyright (C) 2002, Lev Povalahev @@ -205,10 +205,10 @@ typedef Display* ( * PFNGLXGETCURRENTDISPLAYPROC) (void); #define GLX_RGBA_BIT 0x00000001 #define GLX_WINDOW_BIT 0x00000001 #define GLX_COLOR_INDEX_BIT 0x00000002 -#define GLX_PIXMAP_BIT 0x00000002 #define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002 -#define GLX_PBUFFER_BIT 0x00000004 +#define GLX_PIXMAP_BIT 0x00000002 #define GLX_BACK_LEFT_BUFFER_BIT 0x00000004 +#define GLX_PBUFFER_BIT 0x00000004 #define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008 #define GLX_AUX_BUFFERS_BIT 0x00000010 #define GLX_DEPTH_BUFFER_BIT 0x00000020 @@ -1170,10 +1170,10 @@ typedef Bool ( * PFNGLXWAITFORSBCOMLPROC) (Display* dpy, GLXDrawable drawable, i #ifndef GLX_SGIX_fbconfig #define GLX_SGIX_fbconfig 1 -#define GLX_WINDOW_BIT_SGIX 0x00000001 #define GLX_RGBA_BIT_SGIX 0x00000001 -#define GLX_PIXMAP_BIT_SGIX 0x00000002 +#define GLX_WINDOW_BIT_SGIX 0x00000001 #define GLX_COLOR_INDEX_BIT_SGIX 0x00000002 +#define GLX_PIXMAP_BIT_SGIX 0x00000002 #define GLX_SCREEN_EXT 0x800C #define GLX_DRAWABLE_TYPE_SGIX 0x8010 #define GLX_RENDER_TYPE_SGIX 0x8011 @@ -1208,8 +1208,8 @@ typedef XVisualInfo* ( * PFNGLXGETVISUALFROMFBCONFIGSGIXPROC) (Display *dpy, GLX #ifndef GLX_SGIX_hyperpipe #define GLX_SGIX_hyperpipe 1 -#define GLX_PIPE_RECT_SGIX 0x00000001 #define GLX_HYPERPIPE_DISPLAY_PIPE_SGIX 0x00000001 +#define GLX_PIPE_RECT_SGIX 0x00000001 #define GLX_HYPERPIPE_RENDER_PIPE_SGIX 0x00000002 #define GLX_PIPE_RECT_LIMITS_SGIX 0x00000002 #define GLX_HYPERPIPE_STEREO_SGIX 0x00000003 diff --git a/src/glew/include/GL/wglew.h b/src/glew/include/GL/wglew.h index 29f1aa7..da63e40 100644 --- a/src/glew/include/GL/wglew.h +++ b/src/glew/include/GL/wglew.h @@ -1,6 +1,6 @@ /* ** The OpenGL Extension Wrangler Library -** Copyright (C) 2008-2013, Nigel Stewart +** Copyright (C) 2008-2014, Nigel Stewart ** Copyright (C) 2002-2008, Milan Ikits ** Copyright (C) 2002-2008, Marcelo E. Magallon ** Copyright (C) 2002, Lev Povalahev diff --git a/src/glew/src/glew.c b/src/glew/src/glew.c index 4e3eff4..2239864 100644 --- a/src/glew/src/glew.c +++ b/src/glew/src/glew.c @@ -1,6 +1,6 @@ /* ** The OpenGL Extension Wrangler Library -** Copyright (C) 2008-2013, Nigel Stewart +** Copyright (C) 2008-2014, Nigel Stewart ** Copyright (C) 2002-2008, Milan Ikits ** Copyright (C) 2002-2008, Marcelo E. Magallon ** Copyright (C) 2002, Lev Povalahev diff --git a/src/glew/src/glewinfo.c b/src/glew/src/glewinfo.c index f511951..86ef352 100644 --- a/src/glew/src/glewinfo.c +++ b/src/glew/src/glewinfo.c @@ -1,6 +1,6 @@ /* ** The OpenGL Extension Wrangler Library -** Copyright (C) 2008-2013, Nigel Stewart +** Copyright (C) 2008-2014, Nigel Stewart ** Copyright (C) 2002-2008, Milan Ikits ** Copyright (C) 2002-2008, Marcelo E. Magallon ** Copyright (C) 2002, Lev Povalahev diff --git a/src/glsl/include/c99/stdbool.h b/src/glsl/include/c99/stdbool.h index 3041082..2bddfe3 100644 --- a/src/glsl/include/c99/stdbool.h +++ b/src/glsl/include/c99/stdbool.h @@ -35,7 +35,7 @@ #define bool _Bool /* For compilers that don't have the builtin _Bool type. */ -#if (defined(_MSC_VER) || (__STDC_VERSION__ < 199901L && __GNUC__ < 3)) && !defined(_lint) +#if ((defined(_MSC_VER) && (_MSC_VER < 1800)) || (!defined(_MSC_VER) && __STDC_VERSION__ < 199901L && __GNUC__ < 3)) && !defined(_lint) typedef unsigned char _Bool; #endif diff --git a/src/regal/Regal.cpp b/src/regal/Regal.cpp index 9c02f43..004237f 100644 --- a/src/regal/Regal.cpp +++ b/src/regal/Regal.cpp @@ -3,11 +3,11 @@ */ /* - Copyright (c) 2011-2013 NVIDIA Corporation + Copyright (c) 2011-2014 NVIDIA Corporation + Copyright (c) 2012-2014 Scott Nations + Copyright (c) 2012-2014 Nigel Stewart Copyright (c) 2011-2013 Cass Everitt - Copyright (c) 2012-2013 Scott Nations Copyright (c) 2012 Mathias Schott - Copyright (c) 2012-2013 Nigel Stewart Copyright (c) 2012-2013 Google Inc. All rights reserved. @@ -1429,6 +1429,16 @@ extern "C" { #endif App("glGetBooleanv","(", toString(pname), ")"); if (!_context) return; + // Regal interceptions + switch (pname) + { + case GL_NUM_EXTENSIONS: + _context->numExtensions( params ); + return; + + default: + break; + } DispatchTableGL *_next = &_context->dispatcher.front(); RegalAssert(_next); _next->call(&_next->glGetBooleanv)(pname, params); @@ -1457,6 +1467,16 @@ extern "C" { #endif App("glGetDoublev","(", toString(pname), ")"); if (!_context) return; + // Regal interceptions + switch (pname) + { + case GL_NUM_EXTENSIONS: + _context->numExtensions( params ); + return; + + default: + break; + } DispatchTableGL *_next = &_context->dispatcher.front(); RegalAssert(_next); _next->call(&_next->glGetDoublev)(pname, params); @@ -1485,6 +1505,16 @@ extern "C" { #endif App("glGetFloatv","(", toString(pname), ")"); if (!_context) return; + // Regal interceptions + switch (pname) + { + case GL_NUM_EXTENSIONS: + _context->numExtensions( params ); + return; + + default: + break; + } DispatchTableGL *_next = &_context->dispatcher.front(); RegalAssert(_next); _next->call(&_next->glGetFloatv)(pname, params); @@ -1499,6 +1529,16 @@ extern "C" { #endif App("glGetIntegerv","(", toString(pname), ")"); if (!_context) return; + // Regal interceptions + switch (pname) + { + case GL_NUM_EXTENSIONS: + _context->numExtensions( params ); + return; + + default: + break; + } DispatchTableGL *_next = &_context->dispatcher.front(); RegalAssert(_next); _next->call(&_next->glGetIntegerv)(pname, params); @@ -1674,7 +1714,7 @@ extern "C" { case GL_VENDOR: return reinterpret_cast(_context->emuInfo->vendor.c_str()); case GL_RENDERER: return reinterpret_cast(_context->emuInfo->renderer.c_str()); case GL_VERSION: return reinterpret_cast(_context->emuInfo->version.c_str()); - case GL_EXTENSIONS: return reinterpret_cast(_context->emuInfo->extensions.c_str()); + case GL_EXTENSIONS: return reinterpret_cast(_context->extensions.c_str()); default: break; } @@ -8310,6 +8350,18 @@ extern "C" { #endif App("glGetStringi","(", toString(name), ", ", index, ")"); if (!_context) return NULL; + // Regal interceptions + switch (name) + { + case GL_EXTENSIONS: + { + std::set::iterator it = _context->extensionsSet.begin(); + std::advance(it, index); + return reinterpret_cast(it->c_str()); + }; + default: + break; + } DispatchTableGL *_next = &_context->dispatcher.front(); RegalAssert(_next); return _next->call(&_next->glGetStringi)(name, index); @@ -15846,6 +15898,16 @@ extern "C" { #endif App("glGetInteger64v","(", toString(pname), ")"); if (!_context) return; + // Regal interceptions + switch (pname) + { + case GL_NUM_EXTENSIONS: + _context->numExtensions( params ); + return; + + default: + break; + } DispatchTableGL *_next = &_context->dispatcher.front(); RegalAssert(_next); _next->call(&_next->glGetInteger64v)(pname, params); diff --git a/src/regal/RegalBaseVertex.h b/src/regal/RegalBaseVertex.h index 96ee57a..c39dd4f 100644 --- a/src/regal/RegalBaseVertex.h +++ b/src/regal/RegalBaseVertex.h @@ -162,60 +162,215 @@ struct BaseVertex : public ClientState::VertexArray dt.call(&dt.glBindBuffer)(GL_ARRAY_BUFFER, ClientState::VertexArray::arrayBufferBinding); } + template + GLvoid* adjust_indices(GLsizei count, const GLvoid *indices, GLint basevertex) + { + T* ptr = (T*)malloc(count * sizeof(T)); + if(!ptr) return 0; + for(GLsizei i = 0; i < count; i++) ptr[i] = ((T*)indices)[i] + (T) basevertex; + return (GLvoid*) ptr; + } + + GLvoid* adjust_indices(GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex) + { + switch(type) + { + case GL_UNSIGNED_BYTE: + return adjust_indices(count, indices, basevertex); + case GL_UNSIGNED_SHORT: + return adjust_indices(count, indices, basevertex); + case GL_UNSIGNED_INT: + return adjust_indices(count, indices, basevertex); + default: + RegalAssert( "Unknown in for adjust_indices." ); + return 0; + } + } + bool glDrawElementsBaseVertex(RegalContext &ctx, GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex) { + if (ClientState::VertexArray::vertexArrayBinding) + return false; + DispatchTableGL &dt = ctx.dispatcher.emulation; + + GLvoid* adjusted_indices = 0; if (basevertex) - adjust(ctx, dt, basevertex); - dt.call(&dt.glDrawElements)(mode, count, type, indices); + { + if (ClientState::VertexArray::elementArrayBufferBinding) + { + adjust(ctx, dt, basevertex); + } + else + { + adjusted_indices = adjust_indices(count, type, indices, basevertex); + if (!adjusted_indices) + return false; + } + } + + if (basevertex && adjusted_indices) + dt.call(&dt.glDrawElements)(mode, count, type, adjusted_indices); + else + dt.call(&dt.glDrawElements)(mode, count, type, indices); + if (basevertex) - adjust(ctx, dt, 0); + { + if (ClientState::VertexArray::elementArrayBufferBinding) + adjust(ctx, dt, 0); + else + free(adjusted_indices); + } return true; } bool glDrawRangeElementsBaseVertex(RegalContext &ctx, GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex) { + if (ClientState::VertexArray::vertexArrayBinding) + return false; + DispatchTableGL &dt = ctx.dispatcher.emulation; + + GLvoid* adjusted_indices = 0; if (basevertex) - adjust(ctx, dt, basevertex); - dt.call(&dt.glDrawRangeElements)(mode, start, end, count, type, indices); + { + if (ClientState::VertexArray::elementArrayBufferBinding) + { + adjust(ctx, dt, basevertex); + } + else + { + adjusted_indices = adjust_indices(count, type, indices, basevertex); + if (!adjusted_indices) + return false; + } + } + + if (basevertex && adjusted_indices) + dt.call(&dt.glDrawRangeElements)(mode, start, end, count, type, adjusted_indices); + else + dt.call(&dt.glDrawRangeElements)(mode, start, end, count, type, indices); + if (basevertex) - adjust(ctx, dt, 0); + { + if (ClientState::VertexArray::elementArrayBufferBinding) + adjust(ctx, dt, 0); + else + free(adjusted_indices); + } return true; } bool glDrawElementsInstancedBaseVertex(RegalContext &ctx, GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount, GLint basevertex) { + if (ClientState::VertexArray::vertexArrayBinding) + return false; + DispatchTableGL &dt = ctx.dispatcher.emulation; + + GLvoid* adjusted_indices = 0; if (basevertex) - adjust(ctx, dt, basevertex); - dt.call(&dt.glDrawElementsInstanced)(mode, count, type, indices, primcount); + { + if (ClientState::VertexArray::elementArrayBufferBinding) + { + adjust(ctx, dt, basevertex); + } + else + { + adjusted_indices = adjust_indices(count, type, indices, basevertex); + if (!adjusted_indices) + return false; + } + } + + if (basevertex && adjusted_indices) + dt.call(&dt.glDrawElementsInstanced)(mode, count, type, adjusted_indices, primcount); + else + dt.call(&dt.glDrawElementsInstanced)(mode, count, type, indices, primcount); + if (basevertex) - adjust(ctx, dt, 0); + { + if (ClientState::VertexArray::elementArrayBufferBinding) + adjust(ctx, dt, 0); + else + free(adjusted_indices); + } return true; } bool glDrawElementsInstancedBaseVertexBaseInstance(RegalContext &ctx, GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount, GLint basevertex, GLuint baseinstance) { + if (ClientState::VertexArray::vertexArrayBinding) + return false; + DispatchTableGL &dt = ctx.dispatcher.emulation; + + GLvoid* adjusted_indices = 0; if (basevertex) - adjust(ctx, dt, basevertex); - dt.call(&dt.glDrawElementsInstancedBaseInstance)(mode, count, type, indices, primcount, baseinstance); + { + if (ClientState::VertexArray::elementArrayBufferBinding) + { + adjust(ctx, dt, basevertex); + } + else + { + adjusted_indices = adjust_indices(count, type, indices, basevertex); + if (!adjusted_indices) + return false; + } + } + + if (basevertex && adjusted_indices) + dt.call(&dt.glDrawElementsInstancedBaseInstance)(mode, count, type, adjusted_indices, primcount, baseinstance); + else + dt.call(&dt.glDrawElementsInstancedBaseInstance)(mode, count, type, indices, primcount, baseinstance); + if (basevertex) - adjust(ctx, dt, 0); + { + if (ClientState::VertexArray::elementArrayBufferBinding) + adjust(ctx, dt, 0); + else + free(adjusted_indices); + } return true; } bool glMultiDrawElementsBaseVertex(RegalContext &ctx, GLenum mode, const GLsizei *count, GLenum type, const GLvoid * const* indices, GLsizei primcount, const GLint *basevertex) { + if (ClientState::VertexArray::vertexArrayBinding) + return false; + DispatchTableGL &dt = ctx.dispatcher.emulation; + for (GLsizei ii=0; ii +using namespace boost::print; + REGAL_GLOBAL_BEGIN #include "RegalConfig.h" @@ -497,6 +500,13 @@ RegalContext::Init() http.Init( this ); #endif + if (info && emuInfo) + { + extensionsSet.insert(info->extensionsSet.begin(), info->extensionsSet.end()); + extensionsSet.insert(emuInfo->extensionsSet.begin(), emuInfo->extensionsSet.end()); + extensions = ::boost::print::detail::join(extensionsSet,std::string(" ")); + } + initialized = true; } diff --git a/src/regal/RegalContext.h b/src/regal/RegalContext.h index 7857d25..5325a0e 100644 --- a/src/regal/RegalContext.h +++ b/src/regal/RegalContext.h @@ -3,11 +3,11 @@ */ /* - Copyright (c) 2011-2013 NVIDIA Corporation + Copyright (c) 2011-2014 NVIDIA Corporation + Copyright (c) 2012-2014 Scott Nations + Copyright (c) 2012-2014 Nigel Stewart Copyright (c) 2011-2013 Cass Everitt - Copyright (c) 2012-2013 Scott Nations Copyright (c) 2012 Mathias Schott - Copyright (c) 2012-2013 Nigel Stewart Copyright (c) 2012-2013 Google Inc. All rights reserved. @@ -116,6 +116,18 @@ struct RegalContext scoped_ptr dbg; scoped_ptr info; scoped_ptr emuInfo; + std::set extensionsSet; + std::string extensions; + + inline void numExtensions(GLboolean *params) + { + *params = !!extensionsSet.size(); + } + + template inline void numExtensions(T *params) + { + *params = static_cast(extensionsSet.size()); + } #if REGAL_STATISTICS scoped_ptr statistics; diff --git a/src/regal/RegalContextInfo.cpp b/src/regal/RegalContextInfo.cpp index 0159483..2e0a7ff 100644 --- a/src/regal/RegalContextInfo.cpp +++ b/src/regal/RegalContextInfo.cpp @@ -3,11 +3,11 @@ */ /* - Copyright (c) 2011-2013 NVIDIA Corporation + Copyright (c) 2011-2014 NVIDIA Corporation + Copyright (c) 2012-2014 Scott Nations + Copyright (c) 2012-2014 Nigel Stewart Copyright (c) 2011-2013 Cass Everitt - Copyright (c) 2012-2013 Scott Nations Copyright (c) 2012 Mathias Schott - Copyright (c) 2012-2013 Nigel Stewart Copyright (c) 2012-2013 Google Inc. All rights reserved. diff --git a/src/regal/RegalContextInfo.h b/src/regal/RegalContextInfo.h index cae23d5..fedfb9c 100644 --- a/src/regal/RegalContextInfo.h +++ b/src/regal/RegalContextInfo.h @@ -3,11 +3,11 @@ */ /* - Copyright (c) 2011-2013 NVIDIA Corporation + Copyright (c) 2011-2014 NVIDIA Corporation + Copyright (c) 2012-2014 Scott Nations + Copyright (c) 2012-2014 Nigel Stewart Copyright (c) 2011-2013 Cass Everitt - Copyright (c) 2012-2013 Scott Nations Copyright (c) 2012 Mathias Schott - Copyright (c) 2012-2013 Nigel Stewart Copyright (c) 2012-2013 Google Inc. All rights reserved. diff --git a/src/regal/RegalDispatch.h b/src/regal/RegalDispatch.h index 1ec18e6..fc75f06 100644 --- a/src/regal/RegalDispatch.h +++ b/src/regal/RegalDispatch.h @@ -3,11 +3,11 @@ */ /* - Copyright (c) 2011-2013 NVIDIA Corporation + Copyright (c) 2011-2014 NVIDIA Corporation + Copyright (c) 2012-2014 Scott Nations + Copyright (c) 2012-2014 Nigel Stewart Copyright (c) 2011-2013 Cass Everitt - Copyright (c) 2012-2013 Scott Nations Copyright (c) 2012 Mathias Schott - Copyright (c) 2012-2013 Nigel Stewart Copyright (c) 2012-2013 Google Inc. All rights reserved. diff --git a/src/regal/RegalDispatchCode.cpp b/src/regal/RegalDispatchCode.cpp index f69c529..53566b9 100644 --- a/src/regal/RegalDispatchCode.cpp +++ b/src/regal/RegalDispatchCode.cpp @@ -3,11 +3,11 @@ */ /* - Copyright (c) 2011-2013 NVIDIA Corporation + Copyright (c) 2011-2014 NVIDIA Corporation + Copyright (c) 2012-2014 Scott Nations + Copyright (c) 2012-2014 Nigel Stewart Copyright (c) 2011-2013 Cass Everitt - Copyright (c) 2012-2013 Scott Nations Copyright (c) 2012 Mathias Schott - Copyright (c) 2012-2013 Nigel Stewart Copyright (c) 2012-2013 Google Inc. All rights reserved. diff --git a/src/regal/RegalDispatchDebug.cpp b/src/regal/RegalDispatchDebug.cpp index aba156a..5d4be15 100644 --- a/src/regal/RegalDispatchDebug.cpp +++ b/src/regal/RegalDispatchDebug.cpp @@ -3,11 +3,11 @@ */ /* - Copyright (c) 2011-2013 NVIDIA Corporation + Copyright (c) 2011-2014 NVIDIA Corporation + Copyright (c) 2012-2014 Scott Nations + Copyright (c) 2012-2014 Nigel Stewart Copyright (c) 2011-2013 Cass Everitt - Copyright (c) 2012-2013 Scott Nations Copyright (c) 2012 Mathias Schott - Copyright (c) 2012-2013 Nigel Stewart Copyright (c) 2012-2013 Google Inc. All rights reserved. diff --git a/src/regal/RegalDispatchEmu.cpp b/src/regal/RegalDispatchEmu.cpp index 33a4d9b..4682ec3 100644 --- a/src/regal/RegalDispatchEmu.cpp +++ b/src/regal/RegalDispatchEmu.cpp @@ -3,11 +3,11 @@ */ /* - Copyright (c) 2011-2013 NVIDIA Corporation + Copyright (c) 2011-2014 NVIDIA Corporation + Copyright (c) 2012-2014 Scott Nations + Copyright (c) 2012-2014 Nigel Stewart Copyright (c) 2011-2013 Cass Everitt - Copyright (c) 2012-2013 Scott Nations Copyright (c) 2012 Mathias Schott - Copyright (c) 2012-2013 Nigel Stewart Copyright (c) 2012-2013 Google Inc. All rights reserved. @@ -19312,6 +19312,68 @@ static void REGAL_CALL emu_glViewport(GLint x, GLint y, GLsizei width, GLsizei h // GL_VERSION_1_1 +static void REGAL_CALL emu_glArrayElement(GLint index) +{ + RegalContext *_context = REGAL_GET_CONTEXT(); + RegalAssert(_context); + DispatchTableGL &_dispatch = _context->dispatcher.emulation; + + // prefix + switch( _context->emuLevel ) + { + case 16 : + case 15 : + case 14 : + case 13 : + case 12 : + case 11 : + case 10 : + case 9 : + case 8 : + case 7 : + #if REGAL_EMU_IFF + if (_context->iff) break; + #endif + case 1 : + default: + break; + } + + // impl + switch( _context->emuLevel ) + { + case 16 : + case 15 : + case 14 : + case 13 : + case 12 : + case 11 : + case 10 : + case 9 : + case 8 : + case 7 : + #if REGAL_EMU_IFF + if (_context->iff) + { + Push pushLevel(_context->emuLevel); + _context->emuLevel = 6; + _context->iff->ProvokeElement( _context, index ); + return; + } + #endif + case 1 : + default: + { + DispatchTableGL *_next = _dispatch.next(); + RegalAssert(_next); + _next->call(&_next->glArrayElement)(index); + break; + } + + } + +} + static void REGAL_CALL emu_glBindTexture(GLenum target, GLuint texture) { RegalContext *_context = REGAL_GET_CONTEXT(); @@ -19848,15 +19910,6 @@ static void REGAL_CALL emu_glDrawArrays(GLenum mode, GLint first, GLsizei count) _context->dsa->Restore( _context ); } #endif - case 3 : - #if REGAL_EMU_VAO - if (_context->vao) - { - Push pushLevel(_context->emuLevel); - _context->emuLevel = 2; - // _context->vao->Validate(*_context ); - } - #endif case 1 : default: break; @@ -19883,9 +19936,7 @@ static void REGAL_CALL emu_glDrawArrays(GLenum mode, GLint first, GLsizei count) _context->emuLevel = 5; if ( ! _context->quads->glDrawArrays( _context, mode, first, count ) ) { - DispatchTableGL *_next = _context->dispatcher.emulation.next(); - RegalAssert(_next); - return _next->call(&_next->glDrawArrays)( mode, first, count ); + _context->dispatcher.emulation.glDrawArrays( mode, first, count ); } return; @@ -19951,15 +20002,6 @@ static void REGAL_CALL emu_glDrawElements(GLenum mode, GLsizei count, GLenum typ _context->dsa->Restore( _context ); } #endif - case 3 : - #if REGAL_EMU_VAO - if (_context->vao) - { - Push pushLevel(_context->emuLevel); - _context->emuLevel = 2; - // _context->vao->Validate(*_context ); - } - #endif case 1 : default: break; @@ -24066,15 +24108,6 @@ static void REGAL_CALL emu_glMultiDrawArrays(GLenum mode, const GLint *first, co _context->dsa->Restore( _context ); } #endif - case 3 : - #if REGAL_EMU_VAO - if (_context->vao) - { - Push pushLevel(_context->emuLevel); - _context->emuLevel = 2; - // _context->vao->Validate(*_context ); - } - #endif case 1 : default: break; @@ -24132,15 +24165,6 @@ static void REGAL_CALL emu_glMultiDrawElements(GLenum mode, const GLsizei *count _context->dsa->Restore( _context ); } #endif - case 3 : - #if REGAL_EMU_VAO - if (_context->vao) - { - Push pushLevel(_context->emuLevel); - _context->emuLevel = 2; - // _context->vao->Validate(*_context ); - } - #endif case 1 : default: break; @@ -32995,14 +33019,56 @@ static void REGAL_CALL emu_glVertexAttribIPointer(GLuint index, GLint size, GLen _context->bv->glVertexAttribIPointer( index, size, type, stride, pointer ); } #endif + case 8 : + case 7 : + case 6 : + case 5 : + case 4 : + case 3 : + #if REGAL_EMU_VAO + if (_context->vao) break; + #endif case 1 : default: break; } - DispatchTableGL *_next = _dispatch.next(); - RegalAssert(_next); - _next->call(& _next->glVertexAttribIPointer)(index, size, type, stride, pointer); + // impl + switch( _context->emuLevel ) + { + case 16 : + case 15 : + case 14 : + case 13 : + case 12 : + case 11 : + case 10 : + case 9 : + case 8 : + case 7 : + case 6 : + case 5 : + case 4 : + case 3 : + #if REGAL_EMU_VAO + if (_context->vao) + { + Push pushLevel(_context->emuLevel); + _context->emuLevel = 2; + return _context->vao->AttribPointer(*_context, index, size, type, GL_FALSE, stride, pointer ); + } + #endif + case 1 : + default: + { + DispatchTableGL *_next = _dispatch.next(); + RegalAssert(_next); + _next->call(&_next->glVertexAttribIPointer)(index, size, type, stride, pointer); + break; + } + + } + } // GL_VERSION_3_1 @@ -33054,15 +33120,6 @@ static void REGAL_CALL emu_glDrawArraysInstanced(GLenum mode, GLint start, GLsiz _context->dsa->Restore( _context ); } #endif - case 3 : - #if REGAL_EMU_VAO - if (_context->vao) - { - Push pushLevel(_context->emuLevel); - _context->emuLevel = 2; - // _context->vao->Validate(*_context ); - } - #endif case 1 : default: break; @@ -33120,15 +33177,6 @@ static void REGAL_CALL emu_glDrawElementsInstanced(GLenum mode, GLsizei count, G _context->dsa->Restore( _context ); } #endif - case 3 : - #if REGAL_EMU_VAO - if (_context->vao) - { - Push pushLevel(_context->emuLevel); - _context->emuLevel = 2; - // _context->vao->Validate(*_context ); - } - #endif case 1 : default: break; @@ -33489,15 +33537,6 @@ static void REGAL_CALL emu_glMultiDrawArraysIndirectAMD(GLenum mode, const GLvoi _context->dsa->Restore( _context ); } #endif - case 3 : - #if REGAL_EMU_VAO - if (_context->vao) - { - Push pushLevel(_context->emuLevel); - _context->emuLevel = 2; - // _context->vao->Validate(*_context ); - } - #endif case 1 : default: break; @@ -33555,15 +33594,6 @@ static void REGAL_CALL emu_glMultiDrawElementsIndirectAMD(GLenum mode, GLenum ty _context->dsa->Restore( _context ); } #endif - case 3 : - #if REGAL_EMU_VAO - if (_context->vao) - { - Push pushLevel(_context->emuLevel); - _context->emuLevel = 2; - // _context->vao->Validate(*_context ); - } - #endif case 1 : default: break; @@ -33725,15 +33755,6 @@ static void REGAL_CALL emu_glDrawElementArrayAPPLE(GLenum mode, GLint first, GLs _context->dsa->Restore( _context ); } #endif - case 3 : - #if REGAL_EMU_VAO - if (_context->vao) - { - Push pushLevel(_context->emuLevel); - _context->emuLevel = 2; - // _context->vao->Validate(*_context ); - } - #endif case 1 : default: break; @@ -33839,15 +33860,6 @@ static void REGAL_CALL emu_glMultiDrawElementArrayAPPLE(GLenum mode, const GLint _context->dsa->Restore( _context ); } #endif - case 3 : - #if REGAL_EMU_VAO - if (_context->vao) - { - Push pushLevel(_context->emuLevel); - _context->emuLevel = 2; - // _context->vao->Validate(*_context ); - } - #endif case 1 : default: break; @@ -34391,15 +34403,6 @@ static void REGAL_CALL emu_glDrawElementsBaseVertex(GLenum mode, GLsizei count, _context->dsa->Restore( _context ); } #endif - case 3 : - #if REGAL_EMU_VAO - if (_context->vao) - { - Push pushLevel(_context->emuLevel); - _context->emuLevel = 2; - // _context->vao->Validate(*_context ); - } - #endif case 1 : default: break; @@ -34490,15 +34493,6 @@ static void REGAL_CALL emu_glDrawElementsInstancedBaseVertex(GLenum mode, GLsize _context->dsa->Restore( _context ); } #endif - case 3 : - #if REGAL_EMU_VAO - if (_context->vao) - { - Push pushLevel(_context->emuLevel); - _context->emuLevel = 2; - // _context->vao->Validate(*_context ); - } - #endif case 1 : default: break; @@ -34626,7 +34620,12 @@ static void REGAL_CALL emu_glDrawRangeElementsBaseVertex(GLenum mode, GLuint sta { Push pushLevel(_context->emuLevel); _context->emuLevel = 0; - if (REGAL_FORCE_ES2_PROFILE || !_context->info->gl_arb_draw_elements_base_vertex) + // WAR: Our Tegra driver GL 4 core profile supports DrawRangeElementsBaseVertex but does not + // advertise ARB_draw_elements_base_vertex in the extension list so here we check whether the + // driver has glDrawRangeElementsBaseVertex instead of looking for the extension flag. + // (leaving original line here, just commented out) + // if (REGAL_FORCE_ES2_PROFILE || !_context->info->gl_arb_draw_elements_base_vertex) + if (REGAL_FORCE_ES2_PROFILE || !_context->dispatcher.driver.glDrawRangeElementsBaseVertex) { if (basevertex==0) { @@ -34636,7 +34635,7 @@ static void REGAL_CALL emu_glDrawRangeElementsBaseVertex(GLenum mode, GLuint sta } else { - Warning("Regal does not support glDrawRangeElementsBaseVertex (GL_ARB_draw_elements_base_vertex extension not available) for basevertex!=0 for ES 2.0 - skipping."); + Warning("Regal does not support glDrawRangeElementsBaseVertex (GL_ARB_draw_elements_base_vertex extension not available) for basevertex!=0 - skipping."); return; } } @@ -34704,15 +34703,6 @@ static void REGAL_CALL emu_glMultiDrawElementsBaseVertex(GLenum mode, const GLsi _context->dsa->Restore( _context ); } #endif - case 3 : - #if REGAL_EMU_VAO - if (_context->vao) - { - Push pushLevel(_context->emuLevel); - _context->emuLevel = 2; - // _context->vao->Validate(*_context ); - } - #endif case 1 : default: break; @@ -34802,15 +34792,6 @@ static void REGAL_CALL emu_glDrawArraysIndirect(GLenum mode, const GLvoid *indir _context->dsa->Restore( _context ); } #endif - case 3 : - #if REGAL_EMU_VAO - if (_context->vao) - { - Push pushLevel(_context->emuLevel); - _context->emuLevel = 2; - // _context->vao->Validate(*_context ); - } - #endif case 1 : default: break; @@ -34868,15 +34849,6 @@ static void REGAL_CALL emu_glDrawElementsIndirect(GLenum mode, GLenum type, cons _context->dsa->Restore( _context ); } #endif - case 3 : - #if REGAL_EMU_VAO - if (_context->vao) - { - Push pushLevel(_context->emuLevel); - _context->emuLevel = 2; - // _context->vao->Validate(*_context ); - } - #endif case 1 : default: break; @@ -34936,15 +34908,6 @@ static void REGAL_CALL emu_glDrawArraysInstancedARB(GLenum mode, GLint start, GL _context->dsa->Restore( _context ); } #endif - case 3 : - #if REGAL_EMU_VAO - if (_context->vao) - { - Push pushLevel(_context->emuLevel); - _context->emuLevel = 2; - // _context->vao->Validate(*_context ); - } - #endif case 1 : default: break; @@ -35002,15 +34965,6 @@ static void REGAL_CALL emu_glDrawElementsInstancedARB(GLenum mode, GLsizei count _context->dsa->Restore( _context ); } #endif - case 3 : - #if REGAL_EMU_VAO - if (_context->vao) - { - Push pushLevel(_context->emuLevel); - _context->emuLevel = 2; - // _context->vao->Validate(*_context ); - } - #endif case 1 : default: break; @@ -38049,15 +38003,6 @@ static void REGAL_CALL emu_glMultiDrawArraysIndirect(GLenum mode, const GLvoid * _context->dsa->Restore( _context ); } #endif - case 3 : - #if REGAL_EMU_VAO - if (_context->vao) - { - Push pushLevel(_context->emuLevel); - _context->emuLevel = 2; - // _context->vao->Validate(*_context ); - } - #endif case 1 : default: break; @@ -38115,15 +38060,6 @@ static void REGAL_CALL emu_glMultiDrawElementsIndirect(GLenum mode, GLenum type, _context->dsa->Restore( _context ); } #endif - case 3 : - #if REGAL_EMU_VAO - if (_context->vao) - { - Push pushLevel(_context->emuLevel); - _context->emuLevel = 2; - // _context->vao->Validate(*_context ); - } - #endif case 1 : default: break; @@ -44605,9 +44541,7 @@ static void REGAL_CALL emu_glBindVertexArray(GLuint array) { Push pushLevel(_context->emuLevel); _context->emuLevel = 3; - if (!_context->dsa->ShadowVao( array )) { - _dispatch.call(&_dispatch.glBindVertexArray)( array ); - } + _context->dsa->ShadowVao( _context, array ); return; } #endif @@ -44727,7 +44661,7 @@ static void REGAL_CALL emu_glDeleteVertexArrays(GLsizei n, const GLuint *arrays) { Push pushLevel(_context->emuLevel); _context->emuLevel = 2; - _context->vao->DeleteVertexArrays( n, arrays ); + _context->vao->DeleteVertexArrays( *_context, n, arrays ); return; } #endif @@ -47015,6 +46949,9 @@ static void REGAL_CALL emu_glProgramStringARB(GLenum target, GLenum format, GLsi { Push pushLevel(_context->emuLevel); _context->emuLevel = 0; + // nothing to do if len <= 0 so just return + if (len <= 0) + return; if (_context->isES2()) { Warning("Regal does not support glProgramStringARB (GL_ARB_vertex_program) for ES 2.0 context - skipping."); @@ -48990,15 +48927,6 @@ static void REGAL_CALL emu_glDrawElementArrayATI(GLenum mode, GLsizei count) _context->dsa->Restore( _context ); } #endif - case 3 : - #if REGAL_EMU_VAO - if (_context->vao) - { - Push pushLevel(_context->emuLevel); - _context->emuLevel = 2; - // _context->vao->Validate(*_context ); - } - #endif case 1 : default: break; @@ -66278,15 +66206,6 @@ static void REGAL_CALL emu_glDrawArraysInstancedEXT(GLenum mode, GLint start, GL _context->dsa->Restore( _context ); } #endif - case 3 : - #if REGAL_EMU_VAO - if (_context->vao) - { - Push pushLevel(_context->emuLevel); - _context->emuLevel = 2; - // _context->vao->Validate(*_context ); - } - #endif case 1 : default: break; @@ -66344,15 +66263,6 @@ static void REGAL_CALL emu_glDrawElementsInstancedEXT(GLenum mode, GLsizei count _context->dsa->Restore( _context ); } #endif - case 3 : - #if REGAL_EMU_VAO - if (_context->vao) - { - Push pushLevel(_context->emuLevel); - _context->emuLevel = 2; - // _context->vao->Validate(*_context ); - } - #endif case 1 : default: break; @@ -68314,15 +68224,6 @@ static void REGAL_CALL emu_glMultiDrawArraysEXT(GLenum mode, const GLint *first, _context->dsa->Restore( _context ); } #endif - case 3 : - #if REGAL_EMU_VAO - if (_context->vao) - { - Push pushLevel(_context->emuLevel); - _context->emuLevel = 2; - // _context->vao->Validate(*_context ); - } - #endif case 1 : default: break; @@ -68380,15 +68281,6 @@ static void REGAL_CALL emu_glMultiDrawElementsEXT(GLenum mode, const GLsizei *co _context->dsa->Restore( _context ); } #endif - case 3 : - #if REGAL_EMU_VAO - if (_context->vao) - { - Push pushLevel(_context->emuLevel); - _context->emuLevel = 2; - // _context->vao->Validate(*_context ); - } - #endif case 1 : default: break; @@ -70308,6 +70200,68 @@ static void REGAL_CALL emu_glTexStorage3DEXT(GLenum target, GLsizei levels, GLen // GL_EXT_vertex_array +static void REGAL_CALL emu_glArrayElementEXT(GLint i) +{ + RegalContext *_context = REGAL_GET_CONTEXT(); + RegalAssert(_context); + DispatchTableGL &_dispatch = _context->dispatcher.emulation; + + // prefix + switch( _context->emuLevel ) + { + case 16 : + case 15 : + case 14 : + case 13 : + case 12 : + case 11 : + case 10 : + case 9 : + case 8 : + case 7 : + #if REGAL_EMU_IFF + if (_context->iff) break; + #endif + case 1 : + default: + break; + } + + // impl + switch( _context->emuLevel ) + { + case 16 : + case 15 : + case 14 : + case 13 : + case 12 : + case 11 : + case 10 : + case 9 : + case 8 : + case 7 : + #if REGAL_EMU_IFF + if (_context->iff) + { + Push pushLevel(_context->emuLevel); + _context->emuLevel = 6; + _context->iff->ProvokeElement( _context, i ); + return; + } + #endif + case 1 : + default: + { + DispatchTableGL *_next = _dispatch.next(); + RegalAssert(_next); + _next->call(&_next->glArrayElementEXT)(i); + break; + } + + } + +} + static void REGAL_CALL emu_glColorPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer) { RegalContext *_context = REGAL_GET_CONTEXT(); @@ -70440,15 +70394,6 @@ static void REGAL_CALL emu_glDrawArraysEXT(GLenum mode, GLint first, GLsizei cou _context->dsa->Restore( _context ); } #endif - case 3 : - #if REGAL_EMU_VAO - if (_context->vao) - { - Push pushLevel(_context->emuLevel); - _context->emuLevel = 2; - // _context->vao->Validate(*_context ); - } - #endif case 1 : default: break; @@ -70475,9 +70420,7 @@ static void REGAL_CALL emu_glDrawArraysEXT(GLenum mode, GLint first, GLsizei cou _context->emuLevel = 5; if ( ! _context->quads->glDrawArrays( _context, mode, first, count ) ) { - DispatchTableGL *_next = _context->dispatcher.emulation.next(); - RegalAssert(_next); - return _next->call(&_next->glDrawArrays)( mode, first, count ); + _context->dispatcher.emulation.glDrawArrays( mode, first, count ); } return; @@ -72841,6 +72784,7 @@ void InitDispatchTableEmu(DispatchTableGL &tbl) // GL_VERSION_1_1 + tbl.glArrayElement = emu_glArrayElement; tbl.glBindTexture = emu_glBindTexture; tbl.glColorPointer = emu_glColorPointer; tbl.glCopyTexImage2D = emu_glCopyTexImage2D; @@ -73837,6 +73781,7 @@ void InitDispatchTableEmu(DispatchTableGL &tbl) // GL_EXT_vertex_array + tbl.glArrayElementEXT = emu_glArrayElementEXT; tbl.glColorPointerEXT = emu_glColorPointerEXT; tbl.glDrawArraysEXT = emu_glDrawArraysEXT; tbl.glEdgeFlagPointerEXT = emu_glEdgeFlagPointerEXT; diff --git a/src/regal/RegalDispatchError.cpp b/src/regal/RegalDispatchError.cpp index 25f5610..7bc1911 100644 --- a/src/regal/RegalDispatchError.cpp +++ b/src/regal/RegalDispatchError.cpp @@ -3,11 +3,11 @@ */ /* - Copyright (c) 2011-2013 NVIDIA Corporation + Copyright (c) 2011-2014 NVIDIA Corporation + Copyright (c) 2012-2014 Scott Nations + Copyright (c) 2012-2014 Nigel Stewart Copyright (c) 2011-2013 Cass Everitt - Copyright (c) 2012-2013 Scott Nations Copyright (c) 2012 Mathias Schott - Copyright (c) 2012-2013 Nigel Stewart Copyright (c) 2012-2013 Google Inc. All rights reserved. diff --git a/src/regal/RegalDispatchGLX.cpp b/src/regal/RegalDispatchGLX.cpp index 4a48387..c9a9eba 100644 --- a/src/regal/RegalDispatchGLX.cpp +++ b/src/regal/RegalDispatchGLX.cpp @@ -3,11 +3,11 @@ */ /* - Copyright (c) 2011-2013 NVIDIA Corporation + Copyright (c) 2011-2014 NVIDIA Corporation + Copyright (c) 2012-2014 Scott Nations + Copyright (c) 2012-2014 Nigel Stewart Copyright (c) 2011-2013 Cass Everitt - Copyright (c) 2012-2013 Scott Nations Copyright (c) 2012 Mathias Schott - Copyright (c) 2012-2013 Nigel Stewart Copyright (c) 2012-2013 Google Inc. All rights reserved. diff --git a/src/regal/RegalDispatchHttp.cpp b/src/regal/RegalDispatchHttp.cpp index d223f1f..f121991 100644 --- a/src/regal/RegalDispatchHttp.cpp +++ b/src/regal/RegalDispatchHttp.cpp @@ -3,11 +3,11 @@ */ /* - Copyright (c) 2011-2013 NVIDIA Corporation + Copyright (c) 2011-2014 NVIDIA Corporation + Copyright (c) 2012-2014 Scott Nations + Copyright (c) 2012-2014 Nigel Stewart Copyright (c) 2011-2013 Cass Everitt - Copyright (c) 2012-2013 Scott Nations Copyright (c) 2012 Mathias Schott - Copyright (c) 2012-2013 Nigel Stewart Copyright (c) 2012-2013 Google Inc. All rights reserved. diff --git a/src/regal/RegalDispatchLoader.cpp b/src/regal/RegalDispatchLoader.cpp index f9c621d..0083c36 100644 --- a/src/regal/RegalDispatchLoader.cpp +++ b/src/regal/RegalDispatchLoader.cpp @@ -3,11 +3,11 @@ */ /* - Copyright (c) 2011-2013 NVIDIA Corporation + Copyright (c) 2011-2014 NVIDIA Corporation + Copyright (c) 2012-2014 Scott Nations + Copyright (c) 2012-2014 Nigel Stewart Copyright (c) 2011-2013 Cass Everitt - Copyright (c) 2012-2013 Scott Nations Copyright (c) 2012 Mathias Schott - Copyright (c) 2012-2013 Nigel Stewart Copyright (c) 2012-2013 Google Inc. All rights reserved. diff --git a/src/regal/RegalDispatchLog.cpp b/src/regal/RegalDispatchLog.cpp index c69bce7..dd79d7e 100644 --- a/src/regal/RegalDispatchLog.cpp +++ b/src/regal/RegalDispatchLog.cpp @@ -3,11 +3,11 @@ */ /* - Copyright (c) 2011-2013 NVIDIA Corporation + Copyright (c) 2011-2014 NVIDIA Corporation + Copyright (c) 2012-2014 Scott Nations + Copyright (c) 2012-2014 Nigel Stewart Copyright (c) 2011-2013 Cass Everitt - Copyright (c) 2012-2013 Scott Nations Copyright (c) 2012 Mathias Schott - Copyright (c) 2012-2013 Nigel Stewart Copyright (c) 2012-2013 Google Inc. All rights reserved. diff --git a/src/regal/RegalDispatchMissing.cpp b/src/regal/RegalDispatchMissing.cpp index 9e6895c..bbf1905 100644 --- a/src/regal/RegalDispatchMissing.cpp +++ b/src/regal/RegalDispatchMissing.cpp @@ -3,11 +3,11 @@ */ /* - Copyright (c) 2011-2013 NVIDIA Corporation + Copyright (c) 2011-2014 NVIDIA Corporation + Copyright (c) 2012-2014 Scott Nations + Copyright (c) 2012-2014 Nigel Stewart Copyright (c) 2011-2013 Cass Everitt - Copyright (c) 2012-2013 Scott Nations Copyright (c) 2012 Mathias Schott - Copyright (c) 2012-2013 Nigel Stewart Copyright (c) 2012-2013 Google Inc. All rights reserved. diff --git a/src/regal/RegalDispatchPpapi.cpp b/src/regal/RegalDispatchPpapi.cpp index 754d0dd..5e159d5 100644 --- a/src/regal/RegalDispatchPpapi.cpp +++ b/src/regal/RegalDispatchPpapi.cpp @@ -3,11 +3,11 @@ */ /* - Copyright (c) 2011-2013 NVIDIA Corporation + Copyright (c) 2011-2014 NVIDIA Corporation + Copyright (c) 2012-2014 Scott Nations + Copyright (c) 2012-2014 Nigel Stewart Copyright (c) 2011-2013 Cass Everitt - Copyright (c) 2012-2013 Scott Nations Copyright (c) 2012 Mathias Schott - Copyright (c) 2012-2013 Nigel Stewart Copyright (c) 2012-2013 Google Inc. All rights reserved. diff --git a/src/regal/RegalDispatchStaticEGL.cpp b/src/regal/RegalDispatchStaticEGL.cpp index 91f83e9..2068f27 100644 --- a/src/regal/RegalDispatchStaticEGL.cpp +++ b/src/regal/RegalDispatchStaticEGL.cpp @@ -3,11 +3,11 @@ */ /* - Copyright (c) 2011-2013 NVIDIA Corporation + Copyright (c) 2011-2014 NVIDIA Corporation + Copyright (c) 2012-2014 Scott Nations + Copyright (c) 2012-2014 Nigel Stewart Copyright (c) 2011-2013 Cass Everitt - Copyright (c) 2012-2013 Scott Nations Copyright (c) 2012 Mathias Schott - Copyright (c) 2012-2013 Nigel Stewart Copyright (c) 2012-2013 Google Inc. All rights reserved. diff --git a/src/regal/RegalDispatchStaticES2.cpp b/src/regal/RegalDispatchStaticES2.cpp index 9d91f7d..0d83d42 100644 --- a/src/regal/RegalDispatchStaticES2.cpp +++ b/src/regal/RegalDispatchStaticES2.cpp @@ -3,11 +3,11 @@ */ /* - Copyright (c) 2011-2013 NVIDIA Corporation + Copyright (c) 2011-2014 NVIDIA Corporation + Copyright (c) 2012-2014 Scott Nations + Copyright (c) 2012-2014 Nigel Stewart Copyright (c) 2011-2013 Cass Everitt - Copyright (c) 2012-2013 Scott Nations Copyright (c) 2012 Mathias Schott - Copyright (c) 2012-2013 Nigel Stewart Copyright (c) 2012-2013 Google Inc. All rights reserved. @@ -204,6 +204,151 @@ using namespace std; #undef glIsRenderbuffer #undef glRenderbufferStorage +#if REGAL_SYS_PPAPI +#define glBlendFunc GLES2BlendFunc +#define glClear GLES2Clear +#define glClearColor GLES2ClearColor +#define glClearStencil GLES2ClearStencil +#define glColorMask GLES2ColorMask +#define glCullFace GLES2CullFace +#define glDepthFunc GLES2DepthFunc +#define glDepthMask GLES2DepthMask +#define glDisable GLES2Disable +#define glEnable GLES2Enable +#define glFinish GLES2Finish +#define glFlush GLES2Flush +#define glFrontFace GLES2FrontFace +#define glGetBooleanv GLES2GetBooleanv +#define glGetError GLES2GetError +#define glGetFloatv GLES2GetFloatv +#define glGetIntegerv GLES2GetIntegerv +#define glGetString GLES2GetString +#define glGetTexParameterfv GLES2GetTexParameterfv +#define glGetTexParameteriv GLES2GetTexParameteriv +#define glHint GLES2Hint +#define glIsEnabled GLES2IsEnabled +#define glLineWidth GLES2LineWidth +#define glPixelStorei GLES2PixelStorei +#define glReadPixels GLES2ReadPixels +#define glScissor GLES2Scissor +#define glStencilFunc GLES2StencilFunc +#define glStencilMask GLES2StencilMask +#define glStencilOp GLES2StencilOp +#define glTexImage2D GLES2TexImage2D +#define glTexParameterf GLES2TexParameterf +#define glTexParameterfv GLES2TexParameterfv +#define glTexParameteri GLES2TexParameteri +#define glTexParameteriv GLES2TexParameteriv +#define glViewport GLES2Viewport +#define glBindTexture GLES2BindTexture +#define glCopyTexImage2D GLES2CopyTexImage2D +#define glCopyTexSubImage2D GLES2CopyTexSubImage2D +#define glDeleteTextures GLES2DeleteTextures +#define glDrawArrays GLES2DrawArrays +#define glDrawElements GLES2DrawElements +#define glGenTextures GLES2GenTextures +#define glIsTexture GLES2IsTexture +#define glPolygonOffset GLES2PolygonOffset +#define glTexSubImage2D GLES2TexSubImage2D +#define glBlendColor GLES2BlendColor +#define glBlendEquation GLES2BlendEquation +#define glActiveTexture GLES2ActiveTexture +#define glCompressedTexImage2D GLES2CompressedTexImage2D +#define glCompressedTexSubImage2D GLES2CompressedTexSubImage2D +#define glSampleCoverage GLES2SampleCoverage +#define glBlendFuncSeparate GLES2BlendFuncSeparate +#define glBindBuffer GLES2BindBuffer +#define glBufferData GLES2BufferData +#define glBufferSubData GLES2BufferSubData +#define glDeleteBuffers GLES2DeleteBuffers +#define glGenBuffers GLES2GenBuffers +#define glGetBufferParameteriv GLES2GetBufferParameteriv +#define glIsBuffer GLES2IsBuffer +#define glAttachShader GLES2AttachShader +#define glBindAttribLocation GLES2BindAttribLocation +#define glBlendEquationSeparate GLES2BlendEquationSeparate +#define glCompileShader GLES2CompileShader +#define glCreateProgram GLES2CreateProgram +#define glCreateShader GLES2CreateShader +#define glDeleteProgram GLES2DeleteProgram +#define glDeleteShader GLES2DeleteShader +#define glDetachShader GLES2DetachShader +#define glDisableVertexAttribArray GLES2DisableVertexAttribArray +#define glEnableVertexAttribArray GLES2EnableVertexAttribArray +#define glGetActiveAttrib GLES2GetActiveAttrib +#define glGetActiveUniform GLES2GetActiveUniform +#define glGetAttachedShaders GLES2GetAttachedShaders +#define glGetAttribLocation GLES2GetAttribLocation +#define glGetProgramInfoLog GLES2GetProgramInfoLog +#define glGetProgramiv GLES2GetProgramiv +#define glGetShaderInfoLog GLES2GetShaderInfoLog +#define glGetShaderSource GLES2GetShaderSource +#define glGetShaderiv GLES2GetShaderiv +#define glGetUniformLocation GLES2GetUniformLocation +#define glGetUniformfv GLES2GetUniformfv +#define glGetUniformiv GLES2GetUniformiv +#define glGetVertexAttribPointerv GLES2GetVertexAttribPointerv +#define glGetVertexAttribfv GLES2GetVertexAttribfv +#define glGetVertexAttribiv GLES2GetVertexAttribiv +#define glIsProgram GLES2IsProgram +#define glIsShader GLES2IsShader +#define glLinkProgram GLES2LinkProgram +#define glShaderSource GLES2ShaderSource +#define glStencilFuncSeparate GLES2StencilFuncSeparate +#define glStencilMaskSeparate GLES2StencilMaskSeparate +#define glStencilOpSeparate GLES2StencilOpSeparate +#define glUniform1f GLES2Uniform1f +#define glUniform1fv GLES2Uniform1fv +#define glUniform1i GLES2Uniform1i +#define glUniform1iv GLES2Uniform1iv +#define glUniform2f GLES2Uniform2f +#define glUniform2fv GLES2Uniform2fv +#define glUniform2i GLES2Uniform2i +#define glUniform2iv GLES2Uniform2iv +#define glUniform3f GLES2Uniform3f +#define glUniform3fv GLES2Uniform3fv +#define glUniform3i GLES2Uniform3i +#define glUniform3iv GLES2Uniform3iv +#define glUniform4f GLES2Uniform4f +#define glUniform4fv GLES2Uniform4fv +#define glUniform4i GLES2Uniform4i +#define glUniform4iv GLES2Uniform4iv +#define glUniformMatrix2fv GLES2UniformMatrix2fv +#define glUniformMatrix3fv GLES2UniformMatrix3fv +#define glUniformMatrix4fv GLES2UniformMatrix4fv +#define glUseProgram GLES2UseProgram +#define glValidateProgram GLES2ValidateProgram +#define glVertexAttrib1f GLES2VertexAttrib1f +#define glVertexAttrib1fv GLES2VertexAttrib1fv +#define glVertexAttrib2f GLES2VertexAttrib2f +#define glVertexAttrib2fv GLES2VertexAttrib2fv +#define glVertexAttrib3f GLES2VertexAttrib3f +#define glVertexAttrib3fv GLES2VertexAttrib3fv +#define glVertexAttrib4f GLES2VertexAttrib4f +#define glVertexAttrib4fv GLES2VertexAttrib4fv +#define glVertexAttribPointer GLES2VertexAttribPointer +#define glClearDepthf GLES2ClearDepthf +#define glDepthRangef GLES2DepthRangef +#define glGetShaderPrecisionFormat GLES2GetShaderPrecisionFormat +#define glReleaseShaderCompiler GLES2ReleaseShaderCompiler +#define glShaderBinary GLES2ShaderBinary +#define glBindFramebuffer GLES2BindFramebuffer +#define glBindRenderbuffer GLES2BindRenderbuffer +#define glCheckFramebufferStatus GLES2CheckFramebufferStatus +#define glDeleteFramebuffers GLES2DeleteFramebuffers +#define glDeleteRenderbuffers GLES2DeleteRenderbuffers +#define glFramebufferRenderbuffer GLES2FramebufferRenderbuffer +#define glFramebufferTexture2D GLES2FramebufferTexture2D +#define glGenFramebuffers GLES2GenFramebuffers +#define glGenRenderbuffers GLES2GenRenderbuffers +#define glGenerateMipmap GLES2GenerateMipmap +#define glGetFramebufferAttachmentParameteriv GLES2GetFramebufferAttachmentParameteriv +#define glGetRenderbufferParameteriv GLES2GetRenderbufferParameteriv +#define glIsFramebuffer GLES2IsFramebuffer +#define glIsRenderbuffer GLES2IsRenderbuffer +#define glRenderbufferStorage GLES2RenderbufferStorage +#endif + extern "C" { extern void REGAL_CALL glBlendFunc(GLenum sfactor, GLenum dfactor); diff --git a/src/regal/RegalDispatchStatistics.cpp b/src/regal/RegalDispatchStatistics.cpp index 0875ce2..45f8925 100644 --- a/src/regal/RegalDispatchStatistics.cpp +++ b/src/regal/RegalDispatchStatistics.cpp @@ -3,11 +3,11 @@ */ /* - Copyright (c) 2011-2013 NVIDIA Corporation + Copyright (c) 2011-2014 NVIDIA Corporation + Copyright (c) 2012-2014 Scott Nations + Copyright (c) 2012-2014 Nigel Stewart Copyright (c) 2011-2013 Cass Everitt - Copyright (c) 2012-2013 Scott Nations Copyright (c) 2012 Mathias Schott - Copyright (c) 2012-2013 Nigel Stewart Copyright (c) 2012-2013 Google Inc. All rights reserved. diff --git a/src/regal/RegalDispatchTrace.cpp b/src/regal/RegalDispatchTrace.cpp index 1401fce..4c4fb57 100644 --- a/src/regal/RegalDispatchTrace.cpp +++ b/src/regal/RegalDispatchTrace.cpp @@ -3,11 +3,11 @@ */ /* - Copyright (c) 2011-2013 NVIDIA Corporation + Copyright (c) 2011-2014 NVIDIA Corporation + Copyright (c) 2012-2014 Scott Nations + Copyright (c) 2012-2014 Nigel Stewart Copyright (c) 2011-2013 Cass Everitt - Copyright (c) 2012-2013 Scott Nations Copyright (c) 2012 Mathias Schott - Copyright (c) 2012-2013 Nigel Stewart Copyright (c) 2012-2013 Google Inc. All rights reserved. diff --git a/src/regal/RegalDsa.h b/src/regal/RegalDsa.h index 8c069f6..df2ff75 100644 --- a/src/regal/RegalDsa.h +++ b/src/regal/RegalDsa.h @@ -379,10 +379,14 @@ struct Dsa bool NotVao( GLuint vao ) const { return vao != ( dsa.vao != REGAL_DSA_INVALID ? dsa.vao : drv.vao ); } - bool ShadowVao( GLuint vao ) { + void ShadowVao( RegalContext * ctx, GLuint vao ) { drv.vao = vao; - return dsa.vao != REGAL_DSA_INVALID; + if(dsa.vao == REGAL_DSA_INVALID) { + ctx->dispatcher.emulation.glBindVertexArray( vao ); + ctx->dispatcher.emulation.glGetIntegerv(GL_ARRAY_BUFFER_BINDING, reinterpret_cast(&drv.buffer)); + } } + void DsaVao( RegalContext * ctx, GLuint vao ) { if( NotVao( vao ) ) { dsa.vao = vao; diff --git a/src/regal/RegalEmu.h b/src/regal/RegalEmu.h index 1de3eab..a8fa20d 100644 --- a/src/regal/RegalEmu.h +++ b/src/regal/RegalEmu.h @@ -54,6 +54,9 @@ namespace Emu // In ES2 mode, 16 texture units only? // No. of fixed function texture units. 2 minimum. +// Note that this should never be greater than 4 as described here: +// +// http://www.nvidia.com/object/General_FAQ.html#t6 #ifndef REGAL_EMU_MAX_TEXTURE_UNITS #define REGAL_EMU_MAX_TEXTURE_UNITS 4 diff --git a/src/regal/RegalEmuInfo.cpp b/src/regal/RegalEmuInfo.cpp index 71a1d16..fa08f66 100644 --- a/src/regal/RegalEmuInfo.cpp +++ b/src/regal/RegalEmuInfo.cpp @@ -3,11 +3,11 @@ */ /* - Copyright (c) 2011-2013 NVIDIA Corporation + Copyright (c) 2011-2014 NVIDIA Corporation + Copyright (c) 2012-2014 Scott Nations + Copyright (c) 2012-2014 Nigel Stewart Copyright (c) 2011-2013 Cass Everitt - Copyright (c) 2012-2013 Scott Nations Copyright (c) 2012 Mathias Schott - Copyright (c) 2012-2013 Nigel Stewart Copyright (c) 2012-2013 Google Inc. All rights reserved. diff --git a/src/regal/RegalEmuInfo.h b/src/regal/RegalEmuInfo.h index 9ef8b37..d1b6827 100644 --- a/src/regal/RegalEmuInfo.h +++ b/src/regal/RegalEmuInfo.h @@ -3,11 +3,11 @@ */ /* - Copyright (c) 2011-2013 NVIDIA Corporation + Copyright (c) 2011-2014 NVIDIA Corporation + Copyright (c) 2012-2014 Scott Nations + Copyright (c) 2012-2014 Nigel Stewart Copyright (c) 2011-2013 Cass Everitt - Copyright (c) 2012-2013 Scott Nations Copyright (c) 2012 Mathias Schott - Copyright (c) 2012-2013 Nigel Stewart Copyright (c) 2012-2013 Google Inc. All rights reserved. @@ -56,6 +56,9 @@ REGAL_GLOBAL_BEGIN #include #include +#include +#include +#include REGAL_GLOBAL_END diff --git a/src/regal/RegalEnum.h b/src/regal/RegalEnum.h index 87833cc..d1ec77b 100644 --- a/src/regal/RegalEnum.h +++ b/src/regal/RegalEnum.h @@ -3,11 +3,11 @@ */ /* - Copyright (c) 2011-2013 NVIDIA Corporation + Copyright (c) 2011-2014 NVIDIA Corporation + Copyright (c) 2012-2014 Scott Nations + Copyright (c) 2012-2014 Nigel Stewart Copyright (c) 2011-2013 Cass Everitt - Copyright (c) 2012-2013 Scott Nations Copyright (c) 2012 Mathias Schott - Copyright (c) 2012-2013 Nigel Stewart Copyright (c) 2012-2013 Google Inc. All rights reserved. diff --git a/src/regal/RegalIff.cpp b/src/regal/RegalIff.cpp index fcb3a27..294f2fe 100644 --- a/src/regal/RegalIff.cpp +++ b/src/regal/RegalIff.cpp @@ -2010,6 +2010,7 @@ Iff::Iff() , immCurrent(0) , immPrim(GL_POINTS) , immVbo(0) +, immVboElement(0) , immVao(0) , immShadowVao(0) , shadowMatrixMode(GL_MODELVIEW) @@ -2057,6 +2058,7 @@ void Iff::Cleanup( RegalContext &ctx ) DispatchTableGL &tbl = ctx.dispatcher.emulation; tbl.call(&tbl.glDeleteBuffers)(1, &immVbo); + tbl.call(&tbl.glDeleteBuffers)(1, &immVboElement); tbl.call(&tbl.glDeleteVertexArrays)(1, &immVao); size_t n = array_size( ffprogs ); @@ -2370,11 +2372,14 @@ void Iff::InitImmediate(RegalContext &ctx) BindVertexArray( &ctx, immVao ); // to keep ffn current tbl.glGenBuffers( 1, & immVbo ); tbl.glBindBuffer( GL_ARRAY_BUFFER, immVbo ); + tbl.glGenBuffers( 1, & immVboElement ); + tbl.glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, immVboElement ); #if REGAL_SYS_EMSCRIPTEN // We need this to be an allocated buffer for WebGL, because a dangling VertexAttribPointer // doesn't work. XXX -- this might be a Firefox bug, check? tbl.glBufferData( GL_ARRAY_BUFFER, sizeof( immArray ), NULL, GL_STATIC_DRAW ); + tbl.glBufferData( GL_ELEMENT_ARRAY_BUFFER, sizeof( immArrayElement ), NULL, GL_STATIC_DRAW ); #endif for (GLuint i = 0; i < max_vertex_attribs; i++) @@ -2430,7 +2435,7 @@ void Iff::glDeleteBuffers( RegalContext * ctx, GLsizei n, const GLuint * buffers for (GLsizei i = 0; i < n; i++) { GLuint name = buffers[ i ]; - if (name != immVbo) + if (name != immVbo && name != immVboElement) ctx->dispatcher.emulation.glDeleteBuffers( 1, &name ); } } @@ -2472,12 +2477,14 @@ void Iff::Begin( RegalContext * ctx, GLenum mode ) } PreDraw( ctx ); immCurrent = 0; + immCurrentElement = 0; immPrim = mode; } void Iff::End( RegalContext * ctx ) { Flush( ctx ); + RestoreVao( ctx ); } void Iff::RestoreVao( RegalContext * ctx ) @@ -2502,6 +2509,35 @@ void Iff::Flush( RegalContext * ctx ) derivedPrim = GL_TRIANGLE_FAN; tbl.glDrawArrays( derivedPrim, 0, immCurrent ); } + + if (immCurrentElement > 0) + { + DispatchTableGL &tbl = ctx->dispatcher.emulation; + + if(immShadowVao != immVao) + { + tbl.glBindVertexArray( immShadowVao ); + BindVertexArray( ctx, immShadowVao ); + } + + GLuint immShadowVboElement = 0; + ctx->dispatcher.emulation.glGetIntegerv( GL_ELEMENT_ARRAY_BUFFER_BINDING, reinterpret_cast(&immShadowVboElement) ); + if(immShadowVboElement != immVboElement) tbl.glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, immVboElement ); + tbl.glBufferData( GL_ELEMENT_ARRAY_BUFFER, immCurrentElement * sizeof(GLint), immArrayElement, GL_DYNAMIC_DRAW ); + + GLenum derivedPrim = immPrim; + if (( immPrim == GL_POLYGON ) && ( ctx->info->core == true || ctx->info->es2 )) + derivedPrim = GL_TRIANGLE_FAN; + tbl.glDrawElements( derivedPrim, immCurrentElement, GL_UNSIGNED_INT, 0 ); + + if(immShadowVboElement != immVboElement) tbl.glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, immShadowVboElement ); + + if(immShadowVao != immVao) + { + tbl.glBindVertexArray( immVao ); + BindVertexArray( ctx, immVao ); + } + } } void Iff::Provoke( RegalContext * ctx ) @@ -2554,6 +2590,55 @@ void Iff::Provoke( RegalContext * ctx ) } } +void Iff::ProvokeElement( RegalContext * ctx, GLint i ) +{ + immArrayElement[immCurrentElement++] = i; + + if ( immCurrentElement >= REGAL_IMMEDIATE_BUFFER_SIZE ) + { + Flush( ctx ); + int restartVerts = 0; + switch( immPrim ) + { + case GL_QUADS: + restartVerts = REGAL_IMMEDIATE_BUFFER_SIZE % 4; + break; + case GL_TRIANGLES: + restartVerts = REGAL_IMMEDIATE_BUFFER_SIZE % 3; + break; + case GL_LINES: + restartVerts = REGAL_IMMEDIATE_BUFFER_SIZE % 2; + break; + case GL_QUAD_STRIP: + restartVerts = 2; + break; + case GL_TRIANGLE_STRIP: + restartVerts = 2; + break; + case GL_LINE_STRIP: + restartVerts = 1; + break; + default: + break; + } + + // For triangle fan we need the first and last vertices + // for restarting. All others concern the most recent n. + + if (immPrim==GL_TRIANGLE_FAN) + { + immArrayElement[1] = immArrayElement[REGAL_IMMEDIATE_BUFFER_SIZE - 1]; + immCurrentElement = 2; + } + else + { + int offset = REGAL_IMMEDIATE_BUFFER_SIZE - restartVerts; + memcpy( immArrayElement, immArrayElement + offset * sizeof(GLint), restartVerts * sizeof(GLint)); + immCurrentElement = restartVerts; + } + } +} + GLuint Iff::AttrIndex( RegalFixedFunctionAttrib attr, int cat ) const { if (attr < RFF2A_TexCoord) @@ -2775,7 +2860,8 @@ void Iff::ShadowMultiTexBinding( GLenum texunit, GLenum target, GLuint obj ) Internal("Regal::Iff::ShadowMultiTexBinding",toString(texunit)," ",toString(target)," ",obj); // texture unit state is only set when the active texture index is <4 (for fixed function) - if ( texunit - GL_TEXTURE0 > ( REGAL_EMU_MAX_TEXTURE_UNITS - 1 ) ) + if ( texunit - GL_TEXTURE0 >= REGAL_EMU_MAX_TEXTURE_COORDS + || texunit - GL_TEXTURE0 >= REGAL_EMU_MAX_TEXTURE_UNITS ) return; activeTextureIndex = texunit - GL_TEXTURE0; diff --git a/src/regal/RegalIff.h b/src/regal/RegalIff.h index eec43dd..33a7e5d 100644 --- a/src/regal/RegalIff.h +++ b/src/regal/RegalIff.h @@ -815,11 +815,14 @@ struct Iff bool immActive; GLuint immProvoking; GLuint immCurrent; + GLuint immCurrentElement; GLenum immPrim; Float4 immVab[ REGAL_EMU_MAX_VERTEX_ATTRIBS ]; GLubyte immArray[ REGAL_IMMEDIATE_BUFFER_SIZE * REGAL_EMU_MAX_VERTEX_ATTRIBS * sizeof(Float4) ]; + GLint immArrayElement[ REGAL_IMMEDIATE_BUFFER_SIZE ]; GLuint immVbo; + GLuint immVboElement; GLuint immVao; GLuint immShadowVao; @@ -834,6 +837,7 @@ struct Iff void RestoreVao( RegalContext * ctx ); void Flush( RegalContext * ctx ); void Provoke( RegalContext * ctx ); + void ProvokeElement( RegalContext * ctx, GLint i ); template void Attribute( RegalContext * ctx, GLuint idx, const T * v ) { diff --git a/src/regal/RegalLookup.cpp b/src/regal/RegalLookup.cpp index ba94a11..b580d77 100644 --- a/src/regal/RegalLookup.cpp +++ b/src/regal/RegalLookup.cpp @@ -3,11 +3,11 @@ */ /* - Copyright (c) 2011-2013 NVIDIA Corporation + Copyright (c) 2011-2014 NVIDIA Corporation + Copyright (c) 2012-2014 Scott Nations + Copyright (c) 2012-2014 Nigel Stewart Copyright (c) 2011-2013 Cass Everitt - Copyright (c) 2012-2013 Scott Nations Copyright (c) 2012 Mathias Schott - Copyright (c) 2012-2013 Nigel Stewart Copyright (c) 2012-2013 Google Inc. All rights reserved. diff --git a/src/regal/RegalLookup.h b/src/regal/RegalLookup.h index 1d9ad20..add0783 100644 --- a/src/regal/RegalLookup.h +++ b/src/regal/RegalLookup.h @@ -3,11 +3,11 @@ */ /* - Copyright (c) 2011-2013 NVIDIA Corporation + Copyright (c) 2011-2014 NVIDIA Corporation + Copyright (c) 2012-2014 Scott Nations + Copyright (c) 2012-2014 Nigel Stewart Copyright (c) 2011-2013 Cass Everitt - Copyright (c) 2012-2013 Scott Nations Copyright (c) 2012 Mathias Schott - Copyright (c) 2012-2013 Nigel Stewart Copyright (c) 2012-2013 Google Inc. All rights reserved. diff --git a/src/regal/RegalPlugin.cpp b/src/regal/RegalPlugin.cpp index 21edf06..160b350 100644 --- a/src/regal/RegalPlugin.cpp +++ b/src/regal/RegalPlugin.cpp @@ -3,11 +3,11 @@ */ /* - Copyright (c) 2011-2013 NVIDIA Corporation + Copyright (c) 2011-2014 NVIDIA Corporation + Copyright (c) 2012-2014 Scott Nations + Copyright (c) 2012-2014 Nigel Stewart Copyright (c) 2011-2013 Cass Everitt - Copyright (c) 2012-2013 Scott Nations Copyright (c) 2012 Mathias Schott - Copyright (c) 2012-2013 Nigel Stewart Copyright (c) 2012-2013 Google Inc. All rights reserved. diff --git a/src/regal/RegalStatistics.cpp b/src/regal/RegalStatistics.cpp index bf0b658..2f353d2 100644 --- a/src/regal/RegalStatistics.cpp +++ b/src/regal/RegalStatistics.cpp @@ -3,11 +3,11 @@ */ /* - Copyright (c) 2011-2013 NVIDIA Corporation + Copyright (c) 2011-2014 NVIDIA Corporation + Copyright (c) 2012-2014 Scott Nations + Copyright (c) 2012-2014 Nigel Stewart Copyright (c) 2011-2013 Cass Everitt - Copyright (c) 2012-2013 Scott Nations Copyright (c) 2012 Mathias Schott - Copyright (c) 2012-2013 Nigel Stewart Copyright (c) 2012-2013 Google Inc. All rights reserved. diff --git a/src/regal/RegalStatistics.h b/src/regal/RegalStatistics.h index 567d86f..46931e8 100644 --- a/src/regal/RegalStatistics.h +++ b/src/regal/RegalStatistics.h @@ -3,11 +3,11 @@ */ /* - Copyright (c) 2011-2013 NVIDIA Corporation + Copyright (c) 2011-2014 NVIDIA Corporation + Copyright (c) 2012-2014 Scott Nations + Copyright (c) 2012-2014 Nigel Stewart Copyright (c) 2011-2013 Cass Everitt - Copyright (c) 2012-2013 Scott Nations Copyright (c) 2012 Mathias Schott - Copyright (c) 2012-2013 Nigel Stewart Copyright (c) 2012-2013 Google Inc. All rights reserved. diff --git a/src/regal/RegalSystem.h b/src/regal/RegalSystem.h index ea31b91..0452450 100644 --- a/src/regal/RegalSystem.h +++ b/src/regal/RegalSystem.h @@ -3,11 +3,11 @@ */ /* - Copyright (c) 2011-2013 NVIDIA Corporation + Copyright (c) 2011-2014 NVIDIA Corporation + Copyright (c) 2012-2014 Scott Nations + Copyright (c) 2012-2014 Nigel Stewart Copyright (c) 2011-2013 Cass Everitt - Copyright (c) 2012-2013 Scott Nations Copyright (c) 2012 Mathias Schott - Copyright (c) 2012-2013 Nigel Stewart Copyright (c) 2012-2013 Google Inc. All rights reserved. diff --git a/src/regal/RegalToken.cpp b/src/regal/RegalToken.cpp index f2ecfd0..4e0f5b4 100644 --- a/src/regal/RegalToken.cpp +++ b/src/regal/RegalToken.cpp @@ -3,11 +3,11 @@ */ /* - Copyright (c) 2011-2013 NVIDIA Corporation + Copyright (c) 2011-2014 NVIDIA Corporation + Copyright (c) 2012-2014 Scott Nations + Copyright (c) 2012-2014 Nigel Stewart Copyright (c) 2011-2013 Cass Everitt - Copyright (c) 2012-2013 Scott Nations Copyright (c) 2012 Mathias Schott - Copyright (c) 2012-2013 Nigel Stewart Copyright (c) 2012-2013 Google Inc. All rights reserved. diff --git a/src/regal/RegalToken.h b/src/regal/RegalToken.h index 1add5bb..4ac19a8 100644 --- a/src/regal/RegalToken.h +++ b/src/regal/RegalToken.h @@ -3,11 +3,11 @@ */ /* - Copyright (c) 2011-2013 NVIDIA Corporation + Copyright (c) 2011-2014 NVIDIA Corporation + Copyright (c) 2012-2014 Scott Nations + Copyright (c) 2012-2014 Nigel Stewart Copyright (c) 2011-2013 Cass Everitt - Copyright (c) 2012-2013 Scott Nations Copyright (c) 2012 Mathias Schott - Copyright (c) 2012-2013 Nigel Stewart Copyright (c) 2012-2013 Google Inc. All rights reserved. diff --git a/src/regal/RegalUtil.cpp b/src/regal/RegalUtil.cpp index 1015525..e2aacec 100644 --- a/src/regal/RegalUtil.cpp +++ b/src/regal/RegalUtil.cpp @@ -227,7 +227,18 @@ const char *libraryLocation(const Library &library) if (!ret) { #if REGAL_SYS_ANDROID - return "/System/lib/libGLESv1_CM.so"; + const char * const candidates[] = { + "/vendor/lib/egl/libGLESv1_CM.so.1", + "/system/lib/egl/libGLESv1_CM.so.1", + "/system/lib/libGLESv1_CM.so.1", + "/vendor/lib/libGLESv1_CM.so.1", + "/System/lib/libGLESv1_CM.so.1", + NULL + }; + for (const char * const *i = candidates; *i; ++i) { + if (fileExists(*i)) + return *i; + } #elif REGAL_SYS_EGL || REGAL_SYS_GLX // TODO - ES1 for Linux? #endif @@ -263,7 +274,18 @@ const char *libraryLocation(const Library &library) { #if REGAL_SYS_EGL || REGAL_SYS_GLX #if defined(__arm__) - return "/usr/lib/libGLESv2.so"; + const char * const candidates[] = { + "/vendor/lib/egl/libGLESv2.so", + "/system/lib/egl/libGLESv2.so", + "/system/lib/libGLESv2.so", + "/vendor/lib/libGLESv2.so", + "/usr/lib/libGLESv2.so", + NULL + }; + for (const char * const *i = candidates; *i; ++i) { + if (fileExists(*i)) + return *i; + } #elif defined(__x86_64__) || defined(__x86_64) return "/usr/lib/x86_64-linux-gnu/mesa-egl/libGLESv2.so.2"; #else @@ -287,7 +309,18 @@ const char *libraryLocation(const Library &library) { #if REGAL_SYS_EGL #if defined(__arm__) - return "/usr/lib/libEGL.so"; + const char * const candidates[] = { + "/vendor/lib/egl/libEGL.so", + "/system/lib/egl/libEGL.so", + "/system/lib/libEGL.so", + "/vendor/lib/libEGL.so", + "/usr/lib/libEGL.so", + NULL + }; + for (const char * const *i = candidates; *i; ++i) { + if (fileExists(*i)) + return *i; + } #elif defined(__x86_64__) || defined(__x86_64) return "/usr/lib/x86_64-linux-gnu/mesa-egl/libEGL.so"; #else diff --git a/src/regal/RegalVao.h b/src/regal/RegalVao.h index 73c3d96..116c1bd 100644 --- a/src/regal/RegalVao.h +++ b/src/regal/RegalVao.h @@ -60,28 +60,57 @@ namespace Emu struct Vao { + struct DrawElementsIndirectCommand + { + GLuint count; + GLuint primCount; + GLuint firstIndex; + GLuint baseVertex; + GLuint baseInstance; + }; + + struct DrawArraysIndirectCommand + { + GLuint count; + GLuint primCount; + GLuint first; + GLuint baseInstance; + }; + + struct PointerCount + { + GLuint _count; + GLuint64 _ptr; + + bool operator() (const PointerCount& i, const PointerCount& j) { return i._ptr < j._ptr; }; + }; + struct Array { Array() : enabled( GL_FALSE ) , buffer( 0 ) + , shadow_buffer( 0 ) , size( 4 ) , type( GL_FLOAT ) , normalized( GL_FALSE ) , integer( GL_FALSE ) , stride( 0 ) , pointer( NULL ) + , shadow_pointer( NULL ) {} GLboolean enabled; GLuint buffer; + GLuint shadow_buffer; GLint size; GLenum type; GLboolean normalized; GLboolean integer; GLsizei stride; const GLvoid *pointer; + const GLvoid *shadow_pointer; }; struct Object @@ -237,10 +266,7 @@ struct Vao } EnableDisableVertexAttribArray( ctx, a.enabled, i ); - if( a.pointer || a.buffer ) - { - tbl.glVertexAttribPointer( i, a.size, a.type, a.normalized, a.stride, a.pointer ); - } + tbl.glVertexAttribPointer( i, a.size, a.type, a.normalized, a.stride, a.pointer ); } if( lastBuffer != vao.vertexBuffer ) { @@ -274,13 +300,23 @@ struct Vao } } - void DeleteVertexArrays( GLsizei n, const GLuint *arrays ) + void DeleteVertexArrays( RegalContext &ctx, GLsizei n, const GLuint *arrays ) { for( GLsizei i = 0; i < n; i++ ) { GLuint name = arrays[ i ]; if( name != coreVao && objects.count( name ) > 0 ) { + GLuint bos[ REGAL_EMU_MAX_VERTEX_ATTRIBS ]; + GLuint count = 0; + for ( GLsizei j = 0; j < REGAL_EMU_MAX_VERTEX_ATTRIBS; j++ ) + { + GLuint b = objects[name].a[j].shadow_buffer; + if (b) + bos[count++] = b; + } + if (count) + ctx.dispatcher.driver.glDeleteBuffers( count, bos ); objects.erase( name ); } } @@ -400,16 +436,40 @@ struct Vao Array &a = objects[current].a[index]; RegalAssert( currObject != NULL ); - a.buffer = currObject->vertexBuffer; + RegalAssert( currObject->vertexBuffer == 0 || GLuint64( pointer ) < ( 1 << 22 ) ); + + if ( currObject->vertexBuffer == 0 && !pointer ) + return; + + if(currObject->vertexBuffer == 0) + { + if (a.shadow_buffer == 0) + ctx.dispatcher.driver.glGenBuffers( 1, &a.shadow_buffer ); + ctx.dispatcher.driver.glBindBuffer( GL_ARRAY_BUFFER, a.shadow_buffer ); + } + a.size = size; a.type = type; a.normalized = normalized; a.stride = stride; - a.pointer = pointer; - RegalAssert( a.buffer == 0 || GLuint64( a.pointer ) < ( 1 << 22 ) ); + if(currObject->vertexBuffer == 0) + { + a.buffer = a.shadow_buffer; + a.pointer = 0; + a.shadow_pointer = pointer; + } + else + { + a.buffer = currObject->vertexBuffer; + a.pointer = pointer; + a.shadow_pointer = 0; + } + + ctx.dispatcher.emulation.glVertexAttribPointer( index, size, type, normalized, stride, a.pointer ); - ctx.dispatcher.emulation.glVertexAttribPointer( index, size, type, normalized, stride, pointer ); + if (currObject->vertexBuffer == 0) + ctx.dispatcher.driver.glBindBuffer( GL_ARRAY_BUFFER, 0 ); } void Validate( RegalContext &ctx ) @@ -712,7 +772,7 @@ struct Vao if (stride < 0) return; - ShadowVertexArrayPointer(ctx, GL_NORMAL_ARRAY, 0, type, stride, pointer); + ShadowVertexArrayPointer(ctx, GL_NORMAL_ARRAY, 3, type, stride, pointer); } void FogCoordPointer(RegalContext &ctx, GLenum type, GLsizei stride, const GLvoid *pointer) @@ -999,6 +1059,861 @@ struct Vao ShadowEnableDisableClientState( ctx, GL_VERTEX_ARRAY, GL_TRUE ); VertexPointer(ctx, size, GL_FLOAT, stride, pointerv); } + + GLsizei TypeSize(GLenum type) + { + switch(type) + { + case GL_BYTE: + case GL_UNSIGNED_BYTE: + return sizeof(GLbyte); + case GL_SHORT: + case GL_UNSIGNED_SHORT: + case GL_HALF_FLOAT: + return sizeof(GLshort); + case GL_INT: + case GL_UNSIGNED_INT: + case GL_INT_2_10_10_10_REV: + case GL_UNSIGNED_INT_2_10_10_10_REV: + return sizeof(GLint); + case GL_FLOAT: + return sizeof(GLfloat); + case GL_DOUBLE: + return sizeof(GLdouble); + default: + RegalAssert( "Unknown in for TypeSize." ); + return 0; + } + } + + template GLsizei MaxVertexCount(const GLvoid * ptr, GLuint base, GLuint count, GLuint restartIdx, GLboolean restart) + { + GLsizei vtxcount = 0; + const T* indices = static_cast(ptr); + GLuint endo = base + count; + if (restart) + { + for(GLuint i = base; i < endo; i++) + { + if (indices[i] == restartIdx) + continue; + if ((GLsizei) indices[i] > vtxcount) + vtxcount = (GLsizei) indices[i]; + } + } else { + for(GLuint i = base; i < endo; i++) + { + if ((GLsizei) indices[i] > vtxcount) + vtxcount = (GLsizei) indices[i]; + } + } + ++vtxcount; + return vtxcount; + } + + GLsizei MaxVertexCount(RegalContext &ctx, GLenum type, const GLvoid * ptr, GLuint base, GLuint count) + { + GLboolean isRestartVar = ctx.dispatcher.driver.glIsEnabled(GL_PRIMITIVE_RESTART); + GLboolean isRestartFixed = ctx.dispatcher.driver.glIsEnabled(GL_PRIMITIVE_RESTART_FIXED_INDEX); + + GLboolean isRestart = isRestartVar || isRestartFixed; + + GLuint restartIdx = 0; + if (isRestartFixed) + { + switch(type) + { + case GL_UNSIGNED_BYTE: + restartIdx = 0xFF; break; + case GL_UNSIGNED_SHORT: + restartIdx = 0xFFFF; break; + case GL_UNSIGNED_INT: + restartIdx = 0xFFFFFFFF; break; + default: break; + } + } + else + { + ctx.dispatcher.driver.glGetIntegerv(GL_PRIMITIVE_RESTART_INDEX, (GLint*)(&restartIdx)); + } + + switch(type) + { + case GL_UNSIGNED_BYTE: + return MaxVertexCount(ptr, base, count, restartIdx, isRestart); + case GL_UNSIGNED_SHORT: + return MaxVertexCount(ptr, base, count, restartIdx, isRestart); + case GL_UNSIGNED_INT: + return MaxVertexCount(ptr, base, count, restartIdx, isRestart); + default: + RegalAssert( "Unsupported in for MaxVertexCount." ); + return 0; + } + } + + GLuint MaxArraysIndirectCount(const DrawArraysIndirectCommand* indirect, GLint drawcount) + { + GLuint maxCount = 0; + for (GLint i = 0; i < drawcount; i++) + { + if (indirect[i].count > 0x7FFFFFFF) + continue; + GLuint c = indirect[i].count + indirect[i].first; + if (c > maxCount) + maxCount = c; + } + return maxCount; + } + + void DrawArrays(RegalContext &ctx, GLint first, GLsizei count) + { + DrawArraysPrefix(ctx, &first, &count, 1); + } + + GLboolean GetIndirectDrawCount(RegalContext &ctx, GLint* pdrawcount, GLint* clientdrawcount, GLboolean bypass) + { + GLint count_buffer = 0; + ctx.dispatcher.driver.glGetIntegerv(GL_PARAMETER_BUFFER_BINDING_ARB, &count_buffer); + if (bypass || count_buffer == 0) + { + if(!pdrawcount) + return false; + memcpy(clientdrawcount, (GLvoid*)pdrawcount, sizeof(GLuint)); + } + else + { + ctx.dispatcher.driver.glGetBufferSubData(GL_PARAMETER_BUFFER_ARB, (GLintptr) pdrawcount, sizeof(GLuint), clientdrawcount); + } + + return true; + } + + template + GLboolean GetIndirectCommand(RegalContext &ctx, const void* indirect, T* clientCmd, GLint drawcount, GLuint stride, GLboolean bypass) + { + GLint di_buffer = 0; + + if (!bypass) + ctx.dispatcher.driver.glGetIntegerv(GL_DRAW_INDIRECT_BUFFER_BINDING, &di_buffer); + + if (bypass || di_buffer == 0) + { + if (!indirect) + return false; + + if (stride > sizeof(T)) + { + for (GLint i = 0; i < drawcount; i++) + { + const GLubyte* ptr = (const GLubyte*)(indirect) + stride * i; + memcpy(clientCmd + i, ptr, sizeof(T)); + } + } + else + { + memcpy(clientCmd, indirect, sizeof(T) * drawcount); + } + } + else + { + GLvoid* ptrr = ctx.dispatcher.driver.glMapBufferRange(GL_DRAW_INDIRECT_BUFFER, (GLuint64)(indirect) * sizeof(GLubyte), (stride > sizeof(T) ? stride : sizeof(T)) * drawcount, GL_MAP_READ_BIT); + + if (!ptrr) + return false; + + if (stride > sizeof(T)) + { + for(GLint i = 0; i < drawcount; i++) + { + const GLubyte* ptr = (GLubyte*)(ptrr) + stride * i; + memcpy(clientCmd + i, ptr, sizeof(T)); + } + } + else + { + memcpy(clientCmd, ptrr, sizeof(T) * drawcount); + } + + ctx.dispatcher.driver.glUnmapBuffer(GL_DRAW_INDIRECT_BUFFER); + } + return true; + } + + GLboolean DrawArraysPrefixByCommand(RegalContext &ctx, const void* indirect, GLint* pdrawcount, GLint* clientdrawcount, GLsizei maxdrawcount, GLuint stride, GLboolean bypass) + { + GLint drawcount = 1; + + std::vector clientCmd; + + GLboolean ccinit = false; + for (int index= 0; index < REGAL_EMU_MAX_VERTEX_ATTRIBS; index++) + { + Array &a = objects[current].a[index]; + if (!a.enabled || a.buffer != a.shadow_buffer || a.shadow_buffer == 0 || !a.shadow_pointer) + continue; + + if (!ccinit) + { + if (!GetIndirectDrawCount(ctx, pdrawcount, &drawcount, bypass)) + return false; + + drawcount = std::min(drawcount, maxdrawcount); + + if (drawcount <= 0) + return false; + + clientCmd.resize(drawcount); + + if (!GetIndirectCommand(ctx, indirect, &clientCmd[0], drawcount, stride, bypass)) + return false; + + for (GLint i = 0; i < drawcount; i++) + if (clientCmd[i].primCount == 0 || clientCmd[i].primCount > 0x7FFFFFFF) + return false; + + ccinit = true; + } + + GLsizei buffersize = TypeSize(a.type) * (a.size == GL_BGRA ? 4 : a.size) * MaxArraysIndirectCount(&clientCmd[0], drawcount); + if (!buffersize) + continue; + + ctx.dispatcher.driver.glBindBuffer(GL_ARRAY_BUFFER, a.shadow_buffer); + ctx.dispatcher.driver.glBufferData(GL_ARRAY_BUFFER, buffersize, a.shadow_pointer, GL_DYNAMIC_DRAW); + ctx.dispatcher.driver.glBindBuffer(GL_ARRAY_BUFFER, currObject ? currObject->vertexBuffer : 0); + } + + if (clientdrawcount) + *clientdrawcount = drawcount; + + return true; + } + + GLboolean DrawArraysPrefix(RegalContext &ctx, const GLint* first, const GLsizei* count, GLint drawcount) + { + if (drawcount <= 0) + return false; + + std::vector cmd(drawcount); + + for(GLint i = 0; i < drawcount; i++) + { + cmd[i].count = count[i]; + cmd[i].primCount = 1; + cmd[i].first = first[i]; + cmd[i].baseInstance = 0; + } + + return DrawArraysPrefixByCommand(ctx, &cmd[0], &drawcount, NULL, drawcount, 0, true); + } + + GLuint64 MultiCoverage(const DrawElementsIndirectCommand * indirect, GLuint elementSize, const GLvoid * const * pointer, GLint drawcount, GLuint64* offsets, GLvoid** copystart, GLuint64* copylength) + { + static PointerCount sort_func; + + std::vector tmp_idr(drawcount); + + for (GLint i = 0; i < drawcount; i++) + { + tmp_idr[i]._count = indirect[i].count * elementSize; + tmp_idr[i]._ptr = (GLuint64)pointer[i]; + } + + std::sort(tmp_idr.begin(), tmp_idr.end(), sort_func); + + GLuint64 dp = 0; + GLuint64 base = tmp_idr[0]._ptr; + GLuint64 sp = 0; + GLuint64 ep = tmp_idr[0]._count; + offsets[0] = 0; + copystart[0] = (GLvoid*)base; + copylength[0] = ep; + + for(GLint i = 1; i < drawcount; i++) + { + GLuint64 si = tmp_idr[i]._ptr - base; + if (si - dp >= ep) + { + dp = si - ep; + sp = ep; + ep = sp + tmp_idr[i]._count; + copystart[i] = (GLvoid*)(si + base); + copylength[i] = tmp_idr[i]._count; + } + else + { + GLuint64 ei = si - dp + tmp_idr[i]._count; + copystart[i] = (GLvoid*)(ep + dp + base); + if (ei > ep) + { + copylength[i] = ei - ep; + ep = ei; + } + else + { + copylength[i] = 0; + } + sp = si - dp; + } + offsets[i] = sp; + } + + return ep; + } + + GLboolean DrawElementsPrefixByCommand(RegalContext &ctx, GLenum type, const void* indirect, const GLvoid * const * pointer, GLvoid ** offsets_out, GLuint* pidxbuf, GLint* pdrawcount, GLint* clientdrawcount, GLsizei maxdrawcount, GLuint stride, GLboolean bypass) + { + if (!currObject) + return false; + + GLsizei vtxcount = 0; + GLint drawcount = 1; + std::vector clientCmd; + GLboolean ccinit = false; + + for (int index= 0; index < REGAL_EMU_MAX_VERTEX_ATTRIBS; index++) + { + Array &a = objects[current].a[index]; + if(!a.enabled || a.buffer != a.shadow_buffer || a.shadow_buffer == 0 || !a.shadow_pointer) + continue; + + if(!ccinit) + { + if (!GetIndirectDrawCount(ctx, pdrawcount, &drawcount, bypass)) + return false; + + drawcount = std::min(drawcount, maxdrawcount); + + if (drawcount <= 0) + return false; + + clientCmd.resize(drawcount); + + if (!GetIndirectCommand(ctx, indirect, &clientCmd[0], drawcount, stride, bypass)) + return false; + + for (GLint i = 0; i < drawcount; i++) + if (clientCmd[i].primCount == 0 || clientCmd[i].primCount > 0x7FFFFFFF) + return false; + + ccinit = true; + + if (currObject->indexBuffer == 0) + { + if (!pointer) + return false; + + for(GLint i = 0; i < drawcount; i++) + { + if (!pointer[i] || clientCmd[i].count > 0x7FFFFFFF) + continue; + + GLsizei vc = MaxVertexCount(ctx, type, pointer[i], clientCmd[i].firstIndex, clientCmd[i].count) + clientCmd[i].baseVertex; + if (vc > vtxcount) + vtxcount = vc; + } + } + else + { + GLuint minIdx = 0x7FFFFFFF; + GLuint maxIdx = 0; + + for(GLint i = 0; i < drawcount; i++) + { + if (clientCmd[i].count == 0 || clientCmd[i].count > 0x7FFFFFFF) + continue; + if (clientCmd[i].firstIndex < minIdx) + minIdx = clientCmd[i].firstIndex; + if (clientCmd[i].firstIndex + clientCmd[i].count > maxIdx) + maxIdx = clientCmd[i].firstIndex + clientCmd[i].count; + } + + GLvoid* ptr = ctx.dispatcher.driver.glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER, minIdx * TypeSize(type), (maxIdx - minIdx) * TypeSize(type), GL_MAP_READ_BIT); + if (!ptr) + return false; + + for(GLint i = 0; i < drawcount; i++) + { + GLsizei vc = MaxVertexCount(ctx, type, ptr, clientCmd[i].firstIndex, clientCmd[i].count) + clientCmd[i].baseVertex; + if (vc > vtxcount) + vtxcount = vc; + } + ctx.dispatcher.driver.glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER); + } + if(vtxcount < 1) + return false; + } + + GLsizei buffersize = TypeSize(a.type) * (a.size == GL_BGRA ? 4 : a.size) * vtxcount; + if (!buffersize) + continue; + + ctx.dispatcher.driver.glBindBuffer(GL_ARRAY_BUFFER, a.shadow_buffer); + ctx.dispatcher.driver.glBufferData(GL_ARRAY_BUFFER, buffersize, a.shadow_pointer, GL_DYNAMIC_DRAW); + ctx.dispatcher.driver.glBindBuffer(GL_ARRAY_BUFFER, currObject ? currObject->vertexBuffer : 0); + } + + if (currObject->indexBuffer == 0 && pointer && offsets_out) + { + for (GLint i = 0; i < drawcount; i++) + if (!pointer[i]) + return false; + + if (!ccinit) + { + if(!GetIndirectDrawCount(ctx, pdrawcount, &drawcount, bypass)) + return false; + + drawcount = std::min(drawcount, maxdrawcount); + + if (drawcount <= 0) + return false; + + clientCmd.resize(drawcount); + + if (!GetIndirectCommand(ctx, indirect, &clientCmd[0], drawcount, stride, bypass)) + return false; + + for (GLint i = 0; i < drawcount; i++) + if (clientCmd[i].primCount == 0 || clientCmd[i].primCount > 0x7FFFFFFF) + return false; + } + + std::vector offsets(drawcount); + std::vector copylength(drawcount); + std::vector copystart(drawcount); + + GLuint64 buffersize = MultiCoverage(&clientCmd[0], TypeSize(type), pointer, drawcount, &offsets[0], ©start[0], ©length[0]); + + if (buffersize == 0) + return false; + + GLubyte* buffer = (GLubyte*)malloc(buffersize); + + GLuint64 accuLength = 0; + for (GLint i = 0; i < drawcount; accuLength += copylength[i++]) + { + memcpy(buffer + accuLength, copystart[i], copylength[i]); + offsets_out[i] = (GLvoid *) offsets[i]; + } + + ctx.dispatcher.driver.glGenBuffers(1, pidxbuf); + ctx.dispatcher.driver.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, *pidxbuf); + ctx.dispatcher.driver.glBufferData(GL_ELEMENT_ARRAY_BUFFER, buffersize, buffer, GL_DYNAMIC_DRAW); + free(buffer); + } + + if (clientdrawcount) + *clientdrawcount = drawcount; + + return true; + } + + GLboolean DrawElementsPrefix(RegalContext &ctx, GLint drawcount, const GLsizei* count, GLenum type, const GLvoid * const * indices, GLvoid** offsets_out, GLuint* pidxbuf, const GLint* bv) + { + if (drawcount <= 0) + return false; + + std::vector cmd(drawcount); + + for (GLint i = 0; i < drawcount; i++) + { + cmd[i].count = count[i]; + cmd[i].primCount = 1; + cmd[i].firstIndex = 0; + cmd[i].baseVertex = bv[i]; + cmd[i].baseInstance = 0; + } + + return DrawElementsPrefixByCommand(ctx, type, &cmd[0], indices, offsets_out, pidxbuf, &drawcount, NULL, drawcount, 0, true); + } + + void DrawElementsSuffix(RegalContext &ctx, GLuint* pidxbuf) + { + if (!pidxbuf || !(*pidxbuf)) + return; + ctx.dispatcher.driver.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, currObject->indexBuffer); + ctx.dispatcher.driver.glDeleteBuffers(1, pidxbuf); + } + + GLboolean DrawElements(RegalContext &ctx, GLenum mode, GLsizei count, GLenum type, const GLvoid * indices) + { + GLuint idxbuf = 0; + GLint bv = 0; + GLvoid* offset = 0; + + if (!DrawElementsPrefix(ctx, 1, &count, type, &indices, &offset, &idxbuf, &bv)) + return false; + + if (currObject->indexBuffer == 0) + ctx.dispatcher.emulation.glDrawElements(mode, count, type, 0); + else + ctx.dispatcher.emulation.glDrawElements(mode, count, type, indices); + + DrawElementsSuffix(ctx, &idxbuf); + return true; + } + + GLboolean DrawElementsInstanced(RegalContext &ctx, GLenum mode, GLsizei count, GLenum type, const GLvoid * indices, GLsizei primcount) + { + GLuint idxbuf = 0; + GLint bv = 0; + GLvoid* offset = 0; + + if (primcount <= 0) + return false; + + if (!DrawElementsPrefix(ctx, 1, &count, type, &indices, &offset, &idxbuf, &bv)) + return false; + + if (currObject->indexBuffer == 0) + ctx.dispatcher.emulation.glDrawElementsInstanced(mode, count, type, 0, primcount); + else + ctx.dispatcher.emulation.glDrawElementsInstanced(mode, count, type, indices, primcount); + + DrawElementsSuffix(ctx, &idxbuf); + return true; + } + + GLboolean DrawElementsInstancedBaseInstance(RegalContext &ctx, GLenum mode, GLsizei count, GLenum type, const GLvoid * indices, GLsizei primcount, GLuint baseinstance) + { + GLuint idxbuf = 0; + GLint bv = 0; + GLvoid* offset = 0; + + if (primcount <= 0) + return false; + + if (!DrawElementsPrefix(ctx, 1, &count, type, &indices, &offset, &idxbuf, &bv)) + return false; + + if (currObject->indexBuffer == 0) + ctx.dispatcher.emulation.glDrawElementsInstancedBaseInstance(mode, count, type, 0, primcount, baseinstance); + else + ctx.dispatcher.emulation.glDrawElementsInstancedBaseInstance(mode, count, type, indices, primcount, baseinstance); + + DrawElementsSuffix(ctx, &idxbuf); + return true; + } + + GLboolean DrawElementsBaseVertex(RegalContext &ctx, GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex) + { + GLuint idxbuf = 0; + GLvoid* offset = 0; + + if (!DrawElementsPrefix(ctx, 1, &count, type, &indices, &offset, &idxbuf, &basevertex)) + return false; + + if (currObject->indexBuffer == 0) + ctx.dispatcher.emulation.glDrawElementsBaseVertex(mode, count, type, 0, basevertex); + else + ctx.dispatcher.emulation.glDrawElementsBaseVertex(mode, count, type, indices, basevertex); + + DrawElementsSuffix(ctx, &idxbuf); + return true; + } + + GLboolean DrawElementsInstancedBaseVertex(RegalContext &ctx, GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount, GLint basevertex) + { + GLuint idxbuf = 0; + GLvoid* offset = 0; + + if (primcount <= 0) + return false; + + if (!DrawElementsPrefix(ctx, 1, &count, type, &indices, &offset, &idxbuf, &basevertex)) + return false; + + if (currObject->indexBuffer == 0) + ctx.dispatcher.emulation.glDrawElementsInstancedBaseVertex(mode, count, type, 0, primcount, basevertex); + else + ctx.dispatcher.emulation.glDrawElementsInstancedBaseVertex(mode, count, type, indices, primcount, basevertex); + + DrawElementsSuffix(ctx, &idxbuf); + return true; + } + + GLboolean DrawElementsInstancedBaseVertexBaseInstance(RegalContext &ctx, GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount, GLint basevertex, GLuint baseinstance) + { + GLuint idxbuf = 0; + GLvoid* offset = 0; + + if (primcount <= 0) + return false; + + if (!DrawElementsPrefix(ctx, 1, &count, type, &indices, &offset, &idxbuf, &basevertex)) + return false; + + if (currObject->indexBuffer == 0) + ctx.dispatcher.emulation.glDrawElementsInstancedBaseVertexBaseInstance(mode, count, type, 0, primcount, basevertex, baseinstance); + else + ctx.dispatcher.emulation.glDrawElementsInstancedBaseVertexBaseInstance(mode, count, type, indices, primcount, basevertex, baseinstance); + + DrawElementsSuffix(ctx, &idxbuf); + return true; + } + + GLboolean DrawRangeElements(RegalContext &ctx, GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices) + { + GLuint idxbuf = 0; + GLint bv = 0; + GLvoid* offset = 0; + + if (!DrawElementsPrefix(ctx, 1, &count, type, &indices, &offset, &idxbuf, &bv)) + return false; + + if (currObject->indexBuffer == 0) + ctx.dispatcher.emulation.glDrawRangeElements(mode, start, end, count, type, 0); + else + ctx.dispatcher.emulation.glDrawRangeElements(mode, start, end, count, type, indices); + + DrawElementsSuffix(ctx, &idxbuf); + return true; + } + + GLboolean DrawRangeElementsBaseVertex(RegalContext &ctx, GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex) + { + GLuint idxbuf = 0; + GLvoid* offset = 0; + + if (!DrawElementsPrefix(ctx, 1, &count, type, &indices, &offset, &idxbuf, &basevertex)) + return false; + + if (currObject->indexBuffer == 0) + ctx.dispatcher.emulation.glDrawRangeElementsBaseVertex(mode, start, end, count, type, 0, basevertex); + else + ctx.dispatcher.emulation.glDrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex); + + DrawElementsSuffix(ctx, &idxbuf); + return true; + } + + GLboolean DrawArraysIndirectPrefix(RegalContext &ctx, const void *indirect, GLint* pdrawcount, GLsizei maxdrawcount, GLuint stride, GLuint* pidrbuf) + { + GLint drawcount = 1; + if (!DrawArraysPrefixByCommand(ctx, indirect, pdrawcount, &drawcount, maxdrawcount, stride, false)) + return false; + + GLint di_buffer = 0; + ctx.dispatcher.driver.glGetIntegerv(GL_DRAW_INDIRECT_BUFFER_BINDING, &di_buffer); + + if (di_buffer == 0) + { + if (!indirect) + return false; + ctx.dispatcher.driver.glGenBuffers(1, pidrbuf); + ctx.dispatcher.driver.glBindBuffer(GL_DRAW_INDIRECT_BUFFER, *pidrbuf); + ctx.dispatcher.driver.glBufferData(GL_DRAW_INDIRECT_BUFFER, + (stride > sizeof(DrawArraysIndirectCommand) ? stride : sizeof(DrawArraysIndirectCommand)) * drawcount, + indirect, GL_DYNAMIC_DRAW); + } + + return true; + } + + void DrawIndirectSuffix(RegalContext &ctx, GLuint* pidrbuf) + { + if (!pidrbuf || !(*pidrbuf)) + return; + ctx.dispatcher.driver.glBindBuffer(GL_DRAW_INDIRECT_BUFFER, 0); + ctx.dispatcher.driver.glDeleteBuffers(1, pidrbuf); + } + + GLboolean DrawElementsIndirectPrefix(RegalContext &ctx, GLint* pdrawcount, GLsizei maxdrawcount, GLuint stride, GLenum type, const void *indirect, GLuint* pidrbuf, GLuint* pidxbuf) + { + GLint drawcount = 1; + if (!DrawElementsPrefixByCommand(ctx, type, indirect, NULL, NULL, pidxbuf, pdrawcount, &drawcount, maxdrawcount, stride, false)) + return false; + + GLint di_buffer = 0; + ctx.dispatcher.driver.glGetIntegerv(GL_DRAW_INDIRECT_BUFFER_BINDING, &di_buffer); + + if (di_buffer == 0) + { + if (!indirect) + return false; + + ctx.dispatcher.driver.glGenBuffers(1, pidrbuf); + ctx.dispatcher.driver.glBindBuffer(GL_DRAW_INDIRECT_BUFFER, *pidrbuf); + ctx.dispatcher.driver.glBufferData(GL_DRAW_INDIRECT_BUFFER, + (stride > sizeof(DrawElementsIndirectCommand) ? stride : sizeof(DrawElementsIndirectCommand)) * drawcount, + indirect, GL_DYNAMIC_DRAW); + } + + return true; + } + + void DrawElementsIndirectSuffix(RegalContext &ctx, GLuint* pidxbuf, GLuint* pidrbuf) + { + DrawElementsSuffix(ctx, pidxbuf); + DrawIndirectSuffix(ctx, pidrbuf); + } + + GLboolean DrawArraysIndirect(RegalContext &ctx, GLenum mode, const void *indirect) + { + GLuint idrbuf = 0; + GLint drawcount = 1; + + if (!DrawArraysIndirectPrefix(ctx, indirect, &drawcount, (GLsizei) drawcount, 0, &idrbuf)) + return false; + + if (!idrbuf) + ctx.dispatcher.emulation.glDrawArraysIndirect(mode, indirect); + else + ctx.dispatcher.emulation.glDrawArraysIndirect(mode, 0); + + DrawIndirectSuffix(ctx, &idrbuf); + + return true; + } + + GLboolean DrawElementsIndirect(RegalContext &ctx, GLenum mode, GLenum type, const void *indirect) + { + GLuint idxbuf = 0, idrbuf = 0; + GLint drawcount = 1; + + if (!DrawElementsIndirectPrefix(ctx, &drawcount, (GLsizei) drawcount, 0, type, indirect, &idrbuf, &idxbuf)) + return false; + + if (!idrbuf) + ctx.dispatcher.emulation.glDrawElementsIndirect(mode, type, indirect); + else + ctx.dispatcher.emulation.glDrawElementsIndirect(mode, type, 0); + + DrawElementsIndirectSuffix(ctx, &idxbuf, &idrbuf); + + return true; + } + + void MultiDrawArrays(RegalContext &ctx, const GLint * first, const GLsizei * count, GLsizei drawcount) + { + DrawArraysPrefix(ctx, first, count, drawcount); + } + + GLboolean MultiDrawArraysIndirect(RegalContext &ctx, GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride) + { + GLuint idrbuf; + + if (!DrawArraysIndirectPrefix(ctx, indirect, (GLint*) &drawcount, (GLsizei) drawcount, stride, &idrbuf)) + return false; + + if (!idrbuf) + ctx.dispatcher.emulation.glMultiDrawArraysIndirect(mode, indirect, drawcount, stride); + else + ctx.dispatcher.emulation.glMultiDrawArraysIndirect(mode, 0, drawcount, stride); + + DrawIndirectSuffix(ctx, &idrbuf); + + return true; + } + + GLboolean MultiDrawElements(RegalContext &ctx, GLenum mode, const GLsizei *count, GLenum type, const GLvoid * const *indices, GLsizei drawcount) + { + GLuint idxbuf = 0; + std::vector offsets(drawcount); + std::vector bvs(drawcount); + memset(&bvs[0], 0, drawcount * sizeof(GLint)); + + if (!DrawElementsPrefix(ctx, drawcount, count, type, indices, &offsets[0], &idxbuf, &bvs[0])) + return false; + + if (currObject->indexBuffer == 0) + ctx.dispatcher.emulation.glMultiDrawElements(mode, count, type, (const GLvoid * const *)(&offsets[0]), drawcount); + else + ctx.dispatcher.emulation.glMultiDrawElements(mode, count, type, indices, drawcount); + + DrawElementsSuffix(ctx, &idxbuf); + return true; + } + + GLboolean MultiDrawElementsBaseVertex(RegalContext &ctx, GLenum mode, const GLsizei *count, GLenum type, const GLvoid * const *indices, GLsizei drawcount, const GLint *basevertex) + { + GLuint idxbuf = 0; + std::vector offsets(drawcount); + + if (!DrawElementsPrefix(ctx, drawcount, count, type, indices, &offsets[0], &idxbuf, basevertex)) + return false; + + if (currObject->indexBuffer == 0) + ctx.dispatcher.emulation.glMultiDrawElementsBaseVertex(mode, count, type, (const GLvoid * const *)(&offsets[0]), drawcount, basevertex); + else + ctx.dispatcher.emulation.glMultiDrawElementsBaseVertex(mode, count, type, indices, drawcount, basevertex); + + DrawElementsSuffix(ctx, &idxbuf); + return true; + } + + GLboolean MultiDrawElementsIndirect(RegalContext &ctx, GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride) + { + GLuint idxbuf = 0, idrbuf = 0; + + if (!DrawElementsIndirectPrefix(ctx, (GLint*) &drawcount, drawcount, stride, type, indirect, &idrbuf, &idxbuf)) + return false; + + if (!idrbuf) + ctx.dispatcher.emulation.glMultiDrawElementsIndirect(mode, type, indirect, drawcount, stride); + else + ctx.dispatcher.emulation.glMultiDrawElementsIndirect(mode, type, 0, drawcount, stride); + + DrawElementsIndirectSuffix(ctx, &idxbuf, &idrbuf); + + return true; + } + + GLboolean MultiDrawArraysIndirectCount(RegalContext &ctx, GLenum mode, const GLvoid *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride) + { + GLint count_buffer = 0; + + ctx.dispatcher.driver.glGetIntegerv(GL_PARAMETER_BUFFER_BINDING_ARB, &count_buffer); + + if (count_buffer == 0) + { + if (!drawcount) + return false; + return MultiDrawArraysIndirect(ctx, mode, indirect, std::min(*((GLint*)drawcount), (GLint) maxdrawcount), stride); + } + + GLuint idrbuf; + if (!DrawArraysIndirectPrefix(ctx, indirect, (GLint*)drawcount, maxdrawcount, stride, &idrbuf)) + return false; + + if (!idrbuf) + ctx.dispatcher.emulation.glMultiDrawArraysIndirectCountARB(mode, indirect, drawcount, maxdrawcount, stride); + else + ctx.dispatcher.emulation.glMultiDrawArraysIndirectCountARB(mode, 0, drawcount, maxdrawcount, stride); + + DrawIndirectSuffix(ctx, &idrbuf); + + return true; + } + + GLboolean MultiDrawElementsIndirectCount(RegalContext &ctx, GLenum mode, GLenum type, const GLvoid *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride) + { + GLint count_buffer = 0; + + ctx.dispatcher.driver.glGetIntegerv(GL_PARAMETER_BUFFER_BINDING_ARB, &count_buffer); + + if (count_buffer == 0) + { + if (!drawcount) + return false; + return MultiDrawElementsIndirect(ctx, mode, type, indirect, std::min(*((GLint*)drawcount), (GLint) maxdrawcount), stride); + } + + GLuint idxbuf = 0, idrbuf = 0; + + if (!DrawElementsIndirectPrefix(ctx, (GLint*)drawcount, maxdrawcount, stride, type, indirect, &idrbuf, &idxbuf)) + return false; + + if (!idrbuf) + ctx.dispatcher.emulation.glMultiDrawElementsIndirectCountARB(mode, type, indirect, drawcount, maxdrawcount, stride); + else + ctx.dispatcher.emulation.glMultiDrawElementsIndirectCountARB(mode, type, 0, drawcount, maxdrawcount, stride); + + DrawElementsIndirectSuffix(ctx, &idxbuf, &idrbuf); + + return true; + } }; } diff --git a/tests/RegalDispatchGMock.cpp b/tests/RegalDispatchGMock.cpp index a747530..8efbb20 100644 --- a/tests/RegalDispatchGMock.cpp +++ b/tests/RegalDispatchGMock.cpp @@ -3,11 +3,11 @@ */ /* - Copyright (c) 2011-2013 NVIDIA Corporation + Copyright (c) 2011-2014 NVIDIA Corporation + Copyright (c) 2012-2014 Scott Nations + Copyright (c) 2012-2014 Nigel Stewart Copyright (c) 2011-2013 Cass Everitt - Copyright (c) 2012-2013 Scott Nations Copyright (c) 2012 Mathias Schott - Copyright (c) 2012-2013 Nigel Stewart Copyright (c) 2012-2013 Google Inc. All rights reserved. diff --git a/tests/RegalDispatchGMock.h b/tests/RegalDispatchGMock.h index 48f1bdb..48a2992 100644 --- a/tests/RegalDispatchGMock.h +++ b/tests/RegalDispatchGMock.h @@ -3,11 +3,11 @@ */ /* - Copyright (c) 2011-2013 NVIDIA Corporation + Copyright (c) 2011-2014 NVIDIA Corporation + Copyright (c) 2012-2014 Scott Nations + Copyright (c) 2012-2014 Nigel Stewart Copyright (c) 2011-2013 Cass Everitt - Copyright (c) 2012-2013 Scott Nations Copyright (c) 2012 Mathias Schott - Copyright (c) 2012-2013 Nigel Stewart Copyright (c) 2012-2013 Google Inc. All rights reserved. diff --git a/tests/testRegalPpa.cpp b/tests/testRegalPpa.cpp index 030814b..4386412 100644 --- a/tests/testRegalPpa.cpp +++ b/tests/testRegalPpa.cpp @@ -241,10 +241,10 @@ TEST( RegalPpa, PushPopDepthBufferBit ) ppa.glClearDepth( 0.0 ); // check for expected values - EXPECT_EQ( static_cast( GL_TRUE ), ppa.Depth::enable ); - EXPECT_EQ( static_cast( GL_NEVER ), ppa.Depth::func ); - EXPECT_EQ( static_cast( GL_FALSE ), ppa.Depth::mask ); - EXPECT_EQ( static_cast( 0.0 ), ppa.Depth::clear ); + EXPECT_EQ( static_cast( GL_TRUE ), ppa.Ppa::Depth::enable ); + EXPECT_EQ( static_cast( GL_NEVER ), ppa.Ppa::Depth::func ); + EXPECT_EQ( static_cast( GL_FALSE ), ppa.Ppa::Depth::mask ); + EXPECT_EQ( static_cast( 0.0 ), ppa.Ppa::Depth::clear ); // push this state ppa.PushAttrib( &ctx, GL_DEPTH_BUFFER_BIT ); @@ -262,13 +262,13 @@ TEST( RegalPpa, PushPopDepthBufferBit ) ppa.glClearDepth( 0.25 ); // check for expected values - EXPECT_EQ( static_cast( GL_FALSE ), ppa.Depth::enable ); - EXPECT_EQ( static_cast( GL_GREATER ), ppa.Depth::func ); - EXPECT_EQ( static_cast( GL_TRUE ), ppa.Depth::mask ); - EXPECT_EQ( static_cast( 0.25 ), ppa.Depth::clear ); + EXPECT_EQ( static_cast( GL_FALSE ), ppa.Ppa::Depth::enable ); + EXPECT_EQ( static_cast( GL_GREATER ), ppa.Ppa::Depth::func ); + EXPECT_EQ( static_cast( GL_TRUE ), ppa.Ppa::Depth::mask ); + EXPECT_EQ( static_cast( 0.25 ), ppa.Ppa::Depth::clear ); ppa.glClearDepth( 0.5f ); - EXPECT_EQ( static_cast( 0.5 ), ppa.Depth::clear ); + EXPECT_EQ( static_cast( 0.5 ), ppa.Ppa::Depth::clear ); // pop attrib EXPECT_CALL( mock, glEnable(_) ).Times(AnyNumber()); @@ -285,10 +285,10 @@ TEST( RegalPpa, PushPopDepthBufferBit ) EXPECT_EQ( 0u, ppa.polygonStack.size() ); EXPECT_EQ( 0u, ppa.transformStack.size() ); - EXPECT_EQ( static_cast( GL_TRUE ), ppa.Depth::enable ); - EXPECT_EQ( static_cast( GL_NEVER ), ppa.Depth::func ); - EXPECT_EQ( static_cast( GL_FALSE ), ppa.Depth::mask ); - EXPECT_EQ( static_cast( 0.0 ), ppa.Depth::clear ); + EXPECT_EQ( static_cast( GL_TRUE ), ppa.Ppa::Depth::enable ); + EXPECT_EQ( static_cast( GL_NEVER ), ppa.Ppa::Depth::func ); + EXPECT_EQ( static_cast( GL_FALSE ), ppa.Ppa::Depth::mask ); + EXPECT_EQ( static_cast( 0.0 ), ppa.Ppa::Depth::clear ); // pop attrib EXPECT_CALL( mock, glEnable(_) ).Times(AnyNumber()); @@ -305,10 +305,10 @@ TEST( RegalPpa, PushPopDepthBufferBit ) EXPECT_EQ( 0u, ppa.polygonStack.size() ); EXPECT_EQ( 0u, ppa.transformStack.size() ); - EXPECT_EQ( static_cast( GL_FALSE ), ppa.Depth::enable ); - EXPECT_EQ( static_cast( GL_LESS ), ppa.Depth::func ); - EXPECT_EQ( static_cast( GL_TRUE ), ppa.Depth::mask ); - EXPECT_EQ( static_cast( 1.0 ), ppa.Depth::clear ); + EXPECT_EQ( static_cast( GL_FALSE ), ppa.Ppa::Depth::enable ); + EXPECT_EQ( static_cast( GL_LESS ), ppa.Ppa::Depth::func ); + EXPECT_EQ( static_cast( GL_TRUE ), ppa.Ppa::Depth::mask ); + EXPECT_EQ( static_cast( 1.0 ), ppa.Ppa::Depth::clear ); } } // namespace