/* Copyright (c) 2011-2012 NVIDIA Corporation Copyright (c) 2011-2012 Cass Everitt Copyright (c) 2012 Scott Nations Copyright (c) 2012 Mathias Schott Copyright (c) 2012 Nigel Stewart Copyright (c) 2013 Google Inc All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "gtest/gtest.h" #include "gmock/gmock.h" #include "RegalContext.h" #include "RegalContextInfo.h" #include "RegalDispatchGMock.h" #include "RegalPpca.h" namespace { using namespace Regal; using namespace Regal::Emu; using ::testing::Mock; using ::testing::_; using ::testing::AnyNumber; template size_t arraysize( const T( & )[ N ] ) { return N; } void checkNamedVertexArrayDefaults(ClientState::NamedVertexArray& nva, GLuint n) { EXPECT_EQ( GLboolean(GL_FALSE), nva.enabled ); EXPECT_EQ( reinterpret_cast(NULL), nva.pointer ); EXPECT_EQ( GLuint(0), nva.buffer ); EXPECT_EQ( GLint(0), nva.stride ); if (n == ClientState::FOG_COORD || n == ClientState::INDEX || n == ClientState::EDGE_FLAG) EXPECT_EQ( GLint(1), nva.size ); else if (n == ClientState::NORMAL || n == ClientState::SECONDARY_COLOR) EXPECT_EQ( GLint(3), nva.size ); else EXPECT_EQ( GLint(4), nva.size ); if (n == ClientState::EDGE_FLAG) EXPECT_EQ( GLenum(GL_BOOL), nva.type ); else EXPECT_EQ( GLenum(GL_FLOAT), nva.type ); } void checkVertexBufferBindPointDefaults(ClientState::VertexBufferBindPoint& vbbp) { EXPECT_EQ( GLuint(0), vbbp.buffer ); EXPECT_EQ( GLintptr(0), vbbp.offset ); EXPECT_EQ( GLsizei(16), vbbp.stride ); EXPECT_EQ( GLuint(0), vbbp.divisor ); } void checkGenericVertexArrayDefaults(ClientState::GenericVertexArray& gva, GLuint index) { EXPECT_EQ( GLboolean(GL_FALSE), gva.enabled ); EXPECT_EQ( GLuint(4), gva.size ); EXPECT_EQ( GLenum(GL_FLOAT), gva.type ); EXPECT_EQ( GLuint(0), gva.relativeOffset ); EXPECT_EQ( GLboolean(GL_FALSE), gva.normalized ); EXPECT_EQ( GLboolean(GL_FALSE), gva.isInteger ); EXPECT_EQ( GLboolean(GL_FALSE), gva.isLong ); EXPECT_EQ( index, gva.bindingIndex ); } void checkVertexArrayDefaults(ClientState::VertexArray& va) { EXPECT_EQ( GLuint(0), va.elementArrayBufferBinding ); EXPECT_EQ( GLenum(GL_TEXTURE0), va.clientActiveTexture ); EXPECT_EQ( GLboolean(GL_FALSE), va.primitiveRestartFixedIndex ); EXPECT_EQ( GLboolean(GL_FALSE), va.primitiveRestart ); EXPECT_EQ( GLuint(0), va.primitiveRestartIndex ); EXPECT_EQ( GLuint(0), va.arrayBufferBinding ); EXPECT_EQ( GLuint(0), va.vertexArrayBinding ); for (GLuint ii=0; ii::size_type(0), ppca.maskStack.size() ); EXPECT_EQ( std::vector::size_type(0), ppca.vertexArrayStack.size() ); EXPECT_EQ( std::vector::size_type(0), ppca.pixelStoreStack.size() ); checkVertexArrayDefaults(ppca); checkPixelStoreDefaults(ppca); } TEST ( RegalPpca, Ppca_Defaults ) { RegalGMockInterface mock; RegalContext ctx; ctx.info = new ContextInfo(); ctx.info->core = false; ctx.info->es1 = false; ctx.info->es2 = false; InitDispatchTableGMock( ctx.dispatcher.emulation ); Ppca ppca; checkPpcaDefaults(ctx, ppca); GLint maxClientAttribStackDepth = 0; EXPECT_EQ( GLboolean( GL_TRUE ), ppca.glGetv( &ctx, GL_MAX_CLIENT_ATTRIB_STACK_DEPTH, &maxClientAttribStackDepth ) ); EXPECT_GE( maxClientAttribStackDepth, GLint(16) ); const GLbitfield remainder = ~( GL_CLIENT_PIXEL_STORE_BIT | GL_CLIENT_VERTEX_ARRAY_BIT ); EXPECT_CALL( mock, glPushClientAttrib( remainder ) ); ppca.glPushClientAttrib( &ctx, GL_CLIENT_ALL_ATTRIB_BITS ); Mock::VerifyAndClear( &mock ); GLint clientAttribStackDepth = 666; EXPECT_EQ( GLboolean( GL_TRUE ), ppca.glGetv(&ctx, GL_CLIENT_ATTRIB_STACK_DEPTH, &clientAttribStackDepth)); EXPECT_EQ( GLint(1), clientAttribStackDepth ); EXPECT_EQ( std::vector::size_type(1), ppca.maskStack.size() ); EXPECT_EQ( std::vector::size_type(1), ppca.vertexArrayStack.size() ); EXPECT_EQ( std::vector::size_type(1), ppca.pixelStoreStack.size() ); ppca.Reset(ctx); checkPpcaDefaults(ctx, ppca); } TEST ( RegalPpca, VertexArray_Defaults ) { RegalContext ctx; ctx.info = new ContextInfo(); Ppca ppca; checkPpcaDefaults(ctx, ppca); ppca.VertexArray::elementArrayBufferBinding = GLuint(6); ppca.VertexArray::clientActiveTexture = GLenum(6); ppca.VertexArray::primitiveRestartFixedIndex = GLboolean(GL_TRUE); ppca.VertexArray::primitiveRestart = GLboolean(GL_TRUE); ppca.VertexArray::primitiveRestartIndex = GLuint(6); ppca.VertexArray::arrayBufferBinding = GLuint(6); ppca.VertexArray::vertexArrayBinding = GLuint(6); for (GLuint ii=0; ii(77); ppca.VertexArray::named[ii].buffer = GLuint(77); ppca.VertexArray::named[ii].size = GLint(77); ppca.VertexArray::named[ii].type = GLenum(77); ppca.VertexArray::named[ii].stride = GLuint(77); } for (GLuint ii=0; ii(77); state.VertexArray::named[ii].buffer = GLuint(77); state.VertexArray::named[ii].size = GLint(77); state.VertexArray::named[ii].type = GLenum(77); state.VertexArray::named[ii].stride = GLuint(77); } for (GLuint ii=0; ii(77), other.VertexArray::named[ii].pointer ); EXPECT_EQ( GLuint(77), other.VertexArray::named[ii].buffer ); EXPECT_EQ( GLint(77), other.VertexArray::named[ii].size ); EXPECT_EQ( GLenum(77), other.VertexArray::named[ii].type ); EXPECT_EQ( GLuint(77), other.VertexArray::named[ii].stride ); } for (GLuint ii=0; ii::size_type(0), ppca.pixelStoreStack.size() ); ppca.glPixelStore( GL_UNPACK_ALIGNMENT, 100 ); ppca.glPushClientAttrib( &ctx, 0 ); EXPECT_EQ( GLint(100), ppca.PixelStore::unpackAlignment ); EXPECT_EQ( std::vector::size_type(0), ppca.pixelStoreStack.size() ); ppca.glPixelStore( GL_UNPACK_ALIGNMENT, 101 ); ppca.glPushClientAttrib( &ctx, GL_CLIENT_PIXEL_STORE_BIT ); EXPECT_EQ( GLint(101), ppca.PixelStore::unpackAlignment ); EXPECT_EQ( std::vector::size_type(1), ppca.pixelStoreStack.size() ); EXPECT_CALL( mock, glBindBuffer(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glBindVertexArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glBindVertexBuffer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glClientActiveTexture(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glColorPointer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableClientState(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableClientStateiEXT(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableVertexAttribArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEdgeFlagPointer(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnableClientState(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnableVertexAttribArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glFogCoordPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glIndexPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glMultiTexCoordPointerEXT(_,_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glNormalPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glPixelStorei(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glPrimitiveRestartIndex(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glSecondaryColorPointer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribBinding(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribFormat(_,_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribIFormat(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribLFormat(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexBindingDivisor(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexPointer(_,_,_,_) ).Times(AnyNumber()); ppca.glClientAttribDefaultEXT( &ctx, GL_CLIENT_PIXEL_STORE_BIT ); Mock::VerifyAndClear( &mock ); EXPECT_EQ( GLint(4), ppca.PixelStore::unpackAlignment ); EXPECT_EQ( std::vector::size_type(1), ppca.pixelStoreStack.size() ); ppca.glPixelStore( GL_UNPACK_ALIGNMENT, 102 ); EXPECT_EQ( GLint(102), ppca.PixelStore::unpackAlignment ); EXPECT_CALL( mock, glBindBuffer(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glBindVertexArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glBindVertexBuffer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glClientActiveTexture(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glColorPointer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableClientState(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableClientStateiEXT(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableVertexAttribArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEdgeFlagPointer(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnableClientState(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnableVertexAttribArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glFogCoordPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glIndexPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glMultiTexCoordPointerEXT(_,_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glNormalPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glPixelStorei(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glPrimitiveRestartIndex(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glSecondaryColorPointer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribBinding(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribFormat(_,_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribIFormat(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribLFormat(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexBindingDivisor(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexPointer(_,_,_,_) ).Times(AnyNumber()); ppca.glPushClientAttribDefaultEXT( &ctx, GL_CLIENT_PIXEL_STORE_BIT ); Mock::VerifyAndClear( &mock ); EXPECT_EQ( GLint(4), ppca.PixelStore::unpackAlignment ); EXPECT_EQ( std::vector::size_type(2), ppca.pixelStoreStack.size() ); EXPECT_CALL( mock, glBindBuffer(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glBindVertexArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glBindVertexBuffer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glClientActiveTexture(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glColorPointer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableClientState(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableClientStateiEXT(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableVertexAttribArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEdgeFlagPointer(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnableClientState(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnableVertexAttribArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glFogCoordPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glIndexPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glMultiTexCoordPointerEXT(_,_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glNormalPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glPixelStorei(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glPrimitiveRestartIndex(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glSecondaryColorPointer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribBinding(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribFormat(_,_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribIFormat(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribLFormat(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexBindingDivisor(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexPointer(_,_,_,_) ).Times(AnyNumber()); ppca.glPopClientAttrib( &ctx ); Mock::VerifyAndClear( &mock ); EXPECT_EQ( GLint(102), ppca.PixelStore::unpackAlignment ); EXPECT_EQ( std::vector::size_type(1), ppca.pixelStoreStack.size() ); EXPECT_CALL( mock, glBindBuffer(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glBindVertexArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glBindVertexBuffer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glClientActiveTexture(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glColorPointer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableClientState(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableClientStateiEXT(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableVertexAttribArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEdgeFlagPointer(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnableClientState(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnableVertexAttribArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glFogCoordPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glIndexPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glMultiTexCoordPointerEXT(_,_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glNormalPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glPixelStorei(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glPrimitiveRestartIndex(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glSecondaryColorPointer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribBinding(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribFormat(_,_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribIFormat(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribLFormat(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexBindingDivisor(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexPointer(_,_,_,_) ).Times(AnyNumber()); ppca.glPopClientAttrib( &ctx ); Mock::VerifyAndClear( &mock ); EXPECT_EQ( GLint(101), ppca.PixelStore::unpackAlignment ); EXPECT_EQ( std::vector::size_type(0), ppca.pixelStoreStack.size() ); EXPECT_CALL( mock, glBindBuffer(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glBindVertexArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glBindVertexBuffer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glClientActiveTexture(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glColorPointer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableClientState(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableClientStateiEXT(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableVertexAttribArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEdgeFlagPointer(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnableClientState(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnableVertexAttribArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glFogCoordPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glIndexPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glMultiTexCoordPointerEXT(_,_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glNormalPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glPixelStorei(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glPrimitiveRestartIndex(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glSecondaryColorPointer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribBinding(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribFormat(_,_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribIFormat(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribLFormat(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexBindingDivisor(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexPointer(_,_,_,_) ).Times(AnyNumber()); ppca.glPopClientAttrib( &ctx ); Mock::VerifyAndClear( &mock ); EXPECT_EQ( GLint(101), ppca.PixelStore::unpackAlignment ); EXPECT_EQ( std::vector::size_type(0), ppca.pixelStoreStack.size() ); EXPECT_CALL( mock, glBindBuffer(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glBindVertexArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glBindVertexBuffer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glClientActiveTexture(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glColorPointer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableClientState(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableClientStateiEXT(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableVertexAttribArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEdgeFlagPointer(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnableClientState(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnableVertexAttribArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glFogCoordPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glIndexPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glMultiTexCoordPointerEXT(_,_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glNormalPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glPixelStorei(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glPrimitiveRestartIndex(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glSecondaryColorPointer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribBinding(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribFormat(_,_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribIFormat(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribLFormat(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexBindingDivisor(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexPointer(_,_,_,_) ).Times(AnyNumber()); ppca.glPopClientAttrib( &ctx ); Mock::VerifyAndClear( &mock ); EXPECT_EQ( GLint(101), ppca.PixelStore::unpackAlignment ); EXPECT_EQ( std::vector::size_type(0), ppca.pixelStoreStack.size() ); } TEST ( RegalPpca, VertexArray_PushPop ) { RegalGMockInterface mock; RegalContext ctx; ctx.info = new ContextInfo(); ctx.info = new ContextInfo(); InitDispatchTableGMock( ctx.dispatcher.emulation ); Ppca ppca; checkPpcaDefaults(ctx, ppca); EXPECT_EQ( GLint( 0 ), ppca.VertexArray::named[ ClientState::COLOR ].stride ); EXPECT_EQ( std::vector::size_type(0), ppca.vertexArrayStack.size() ); ppca.glColorPointer ( 4, GL_FLOAT, 100, NULL ); ppca.glPushClientAttrib( &ctx, 0 ); EXPECT_EQ( GLint( 100 ), ppca.VertexArray::named[ ClientState::COLOR ].stride ); EXPECT_EQ( std::vector::size_type(0), ppca.vertexArrayStack.size() ); ppca.glColorPointer ( 4, GL_FLOAT, 101, NULL ); ppca.glPushClientAttrib( &ctx, GL_CLIENT_VERTEX_ARRAY_BIT ); EXPECT_EQ( GLint( 101 ), ppca.VertexArray::named[ ClientState::COLOR ].stride ); EXPECT_EQ( std::vector::size_type(1), ppca.vertexArrayStack.size() ); EXPECT_CALL( mock, glBindBuffer(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glBindVertexArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glBindVertexBuffer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glClientActiveTexture(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glColorPointer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisable(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableClientState(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableClientStateiEXT(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableVertexAttribArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEdgeFlagPointer(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnable(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnableClientState(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnableVertexAttribArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glFogCoordPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glIndexPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glMultiTexCoordPointerEXT(_,_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glNormalPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glPixelStorei(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glPrimitiveRestartIndex(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glSecondaryColorPointer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribBinding(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribFormat(_,_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribIFormat(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribLFormat(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexBindingDivisor(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexPointer(_,_,_,_) ).Times(AnyNumber()); ppca.glClientAttribDefaultEXT( &ctx, GL_CLIENT_VERTEX_ARRAY_BIT ); Mock::VerifyAndClear( &mock ); EXPECT_EQ( GLint( 0 ), ppca.VertexArray::named[ ClientState::COLOR ].stride ); EXPECT_EQ( std::vector::size_type(1), ppca.vertexArrayStack.size() ); ppca.glColorPointer ( 4, GL_FLOAT, 102, NULL ); EXPECT_CALL( mock, glBindBuffer(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glBindVertexArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glBindVertexBuffer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glClientActiveTexture(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glColorPointer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisable(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableClientState(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableClientStateiEXT(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableVertexAttribArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEdgeFlagPointer(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnable(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnableClientState(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnableVertexAttribArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glFogCoordPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glIndexPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glMultiTexCoordPointerEXT(_,_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glNormalPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glPixelStorei(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glPrimitiveRestartIndex(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glSecondaryColorPointer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribBinding(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribFormat(_,_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribIFormat(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribLFormat(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexBindingDivisor(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexPointer(_,_,_,_) ).Times(AnyNumber()); ppca.glPushClientAttribDefaultEXT( &ctx, GL_CLIENT_VERTEX_ARRAY_BIT ); Mock::VerifyAndClear( &mock ); EXPECT_EQ( GLint( 0 ), ppca.VertexArray::named[ ClientState::COLOR ].stride ); EXPECT_EQ( std::vector::size_type(2), ppca.vertexArrayStack.size() ); EXPECT_CALL( mock, glBindBuffer(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glBindVertexArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glBindVertexBuffer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glClientActiveTexture(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glColorPointer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisable(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableClientState(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableClientStateiEXT(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableVertexAttribArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEdgeFlagPointer(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnable(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnableClientState(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnableVertexAttribArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glFogCoordPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glIndexPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glMultiTexCoordPointerEXT(_,_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glNormalPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glPixelStorei(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glPrimitiveRestartIndex(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glSecondaryColorPointer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribBinding(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribFormat(_,_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribIFormat(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribLFormat(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexBindingDivisor(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexPointer(_,_,_,_) ).Times(AnyNumber()); ppca.glPopClientAttrib( &ctx ); Mock::VerifyAndClear( &mock ); EXPECT_EQ( GLint( 102 ), ppca.VertexArray::named[ ClientState::COLOR ].stride ); EXPECT_EQ( std::vector::size_type(1), ppca.vertexArrayStack.size() ); EXPECT_CALL( mock, glBindBuffer(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glBindVertexArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glBindVertexBuffer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glClientActiveTexture(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glColorPointer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisable(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableClientState(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableClientStateiEXT(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableVertexAttribArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEdgeFlagPointer(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnable(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnableClientState(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnableVertexAttribArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glFogCoordPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glIndexPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glMultiTexCoordPointerEXT(_,_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glNormalPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glPixelStorei(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glPrimitiveRestartIndex(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glSecondaryColorPointer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribBinding(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribFormat(_,_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribIFormat(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribLFormat(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexBindingDivisor(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexPointer(_,_,_,_) ).Times(AnyNumber()); ppca.glPopClientAttrib( &ctx ); Mock::VerifyAndClear( &mock ); EXPECT_EQ( GLint( 101 ), ppca.VertexArray::named[ ClientState::COLOR ].stride ); EXPECT_EQ( std::vector::size_type(0), ppca.vertexArrayStack.size() ); ppca.glPopClientAttrib( &ctx ); Mock::VerifyAndClear( &mock ); EXPECT_EQ( GLint( 101 ), ppca.VertexArray::named[ ClientState::COLOR ].stride ); EXPECT_EQ( std::vector::size_type(0), ppca.vertexArrayStack.size() ); ppca.glPopClientAttrib( &ctx ); Mock::VerifyAndClear( &mock ); EXPECT_EQ( GLint( 101 ), ppca.VertexArray::named[ ClientState::COLOR ].stride ); EXPECT_EQ( std::vector::size_type(0), ppca.vertexArrayStack.size() ); } TEST ( RegalPpca, ClientAttrib_PushPop ) { RegalGMockInterface mock; RegalContext ctx; ctx.info = new ContextInfo(); ctx.info->core = false; ctx.info->es1 = false; ctx.info->es2 = false; InitDispatchTableGMock( ctx.dispatcher.emulation ); Ppca ppca; checkPpcaDefaults(ctx, ppca); const GLbitfield remainder = ~( GL_CLIENT_PIXEL_STORE_BIT | GL_CLIENT_VERTEX_ARRAY_BIT ); GLint clientAttribStackDepth = 666; EXPECT_EQ( GLboolean( GL_TRUE ), ppca.glGetv(&ctx, GL_CLIENT_ATTRIB_STACK_DEPTH, &clientAttribStackDepth)); EXPECT_EQ( clientAttribStackDepth, GLint(0) ); EXPECT_EQ( std::vector::size_type(0), ppca.maskStack.size() ); EXPECT_EQ( std::vector::size_type(0), ppca.vertexArrayStack.size() ); EXPECT_EQ( std::vector::size_type(0), ppca.pixelStoreStack.size() ); ppca.glPushClientAttrib( &ctx, GL_CLIENT_PIXEL_STORE_BIT ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.glGetv(&ctx, GL_CLIENT_ATTRIB_STACK_DEPTH, &clientAttribStackDepth)); EXPECT_EQ( clientAttribStackDepth, GLint(1) ); EXPECT_EQ( std::vector::size_type(1), ppca.maskStack.size() ); EXPECT_EQ( std::vector::size_type(0), ppca.vertexArrayStack.size() ); EXPECT_EQ( std::vector::size_type(1), ppca.pixelStoreStack.size() ); ppca.glPushClientAttrib( &ctx, GL_CLIENT_VERTEX_ARRAY_BIT ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.glGetv(&ctx, GL_CLIENT_ATTRIB_STACK_DEPTH, &clientAttribStackDepth)); EXPECT_EQ( clientAttribStackDepth, GLint(2) ); EXPECT_EQ( std::vector::size_type(2), ppca.maskStack.size() ); EXPECT_EQ( std::vector::size_type(1), ppca.vertexArrayStack.size() ); EXPECT_EQ( std::vector::size_type(1), ppca.pixelStoreStack.size() ); EXPECT_CALL( mock, glPushClientAttrib( remainder ) ); ppca.glPushClientAttrib( &ctx, GL_CLIENT_ALL_ATTRIB_BITS ); Mock::VerifyAndClear( &mock ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.glGetv(&ctx, GL_CLIENT_ATTRIB_STACK_DEPTH, &clientAttribStackDepth)); EXPECT_EQ( clientAttribStackDepth, GLint(3) ); EXPECT_EQ( std::vector::size_type(3), ppca.maskStack.size() ); EXPECT_EQ( std::vector::size_type(2), ppca.vertexArrayStack.size() ); EXPECT_EQ( std::vector::size_type(2), ppca.pixelStoreStack.size() ); EXPECT_CALL( mock, glBindBuffer(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glBindVertexArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glBindVertexBuffer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glClientActiveTexture(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glColorPointer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisable(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableClientState(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableClientStateiEXT(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableVertexAttribArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEdgeFlagPointer(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnable(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnableClientState(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnableVertexAttribArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glFogCoordPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glIndexPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glMultiTexCoordPointerEXT(_,_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glNormalPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glPixelStorei(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glPrimitiveRestartIndex(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glSecondaryColorPointer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribBinding(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribFormat(_,_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribIFormat(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribLFormat(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexBindingDivisor(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexPointer(_,_,_,_) ).Times(AnyNumber()); ctx.info->es2 = true; ppca.glPushClientAttrib( &ctx, GL_CLIENT_ALL_ATTRIB_BITS ); ppca.glPopClientAttrib( &ctx ); ctx.info->es2 = false; Mock::VerifyAndClear( &mock ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.glGetv(&ctx, GL_CLIENT_ATTRIB_STACK_DEPTH, &clientAttribStackDepth)); EXPECT_EQ( clientAttribStackDepth, GLint(3) ); EXPECT_EQ( std::vector::size_type(3), ppca.maskStack.size() ); EXPECT_EQ( std::vector::size_type(2), ppca.vertexArrayStack.size() ); EXPECT_EQ( std::vector::size_type(2), ppca.pixelStoreStack.size() ); EXPECT_CALL( mock, glBindBuffer(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glBindVertexArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glBindVertexBuffer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glClientActiveTexture(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glColorPointer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisable(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableClientState(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableClientStateiEXT(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableVertexAttribArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEdgeFlagPointer(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnable(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnableClientState(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnableVertexAttribArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glFogCoordPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glIndexPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glMultiTexCoordPointerEXT(_,_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glNormalPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glPixelStorei(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glPrimitiveRestartIndex(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glSecondaryColorPointer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribBinding(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribFormat(_,_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribIFormat(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribLFormat(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexBindingDivisor(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexPointer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glPopClientAttrib() ); EXPECT_CALL( mock, glBindBuffer(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glBindVertexArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glBindVertexBuffer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glClientActiveTexture(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glColorPointer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisable(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableClientState(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableClientStateiEXT(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableVertexAttribArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEdgeFlagPointer(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnable(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnableClientState(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnableVertexAttribArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glFogCoordPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glIndexPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glMultiTexCoordPointerEXT(_,_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glNormalPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glPixelStorei(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glPrimitiveRestartIndex(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glSecondaryColorPointer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribBinding(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribFormat(_,_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribIFormat(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribLFormat(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexBindingDivisor(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexPointer(_,_,_,_) ).Times(AnyNumber()); ppca.glPopClientAttrib( &ctx ); Mock::VerifyAndClear( &mock ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.glGetv(&ctx, GL_CLIENT_ATTRIB_STACK_DEPTH, &clientAttribStackDepth)); EXPECT_EQ( clientAttribStackDepth, GLint(2) ); EXPECT_EQ( std::vector::size_type(2), ppca.maskStack.size() ); EXPECT_EQ( std::vector::size_type(1), ppca.vertexArrayStack.size() ); EXPECT_EQ( std::vector::size_type(1), ppca.pixelStoreStack.size() ); EXPECT_CALL( mock, glBindBuffer(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glBindVertexArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glBindVertexBuffer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glClientActiveTexture(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glColorPointer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisable(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableClientState(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableClientStateiEXT(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableVertexAttribArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEdgeFlagPointer(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnable(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnableClientState(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnableVertexAttribArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glFogCoordPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glIndexPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glMultiTexCoordPointerEXT(_,_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glNormalPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glPixelStorei(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glPrimitiveRestartIndex(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glSecondaryColorPointer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribBinding(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribFormat(_,_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribIFormat(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribLFormat(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexBindingDivisor(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexPointer(_,_,_,_) ).Times(AnyNumber()); ppca.glPopClientAttrib( &ctx ); Mock::VerifyAndClear( &mock ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.glGetv(&ctx, GL_CLIENT_ATTRIB_STACK_DEPTH, &clientAttribStackDepth)); EXPECT_EQ( clientAttribStackDepth, GLint(1) ); EXPECT_EQ( std::vector::size_type(1), ppca.maskStack.size() ); EXPECT_EQ( std::vector::size_type(0), ppca.vertexArrayStack.size() ); EXPECT_EQ( std::vector::size_type(1), ppca.pixelStoreStack.size() ); EXPECT_CALL( mock, glBindBuffer(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glBindVertexArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glBindVertexBuffer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glClientActiveTexture(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glColorPointer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisable(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableClientState(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableClientStateiEXT(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableVertexAttribArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEdgeFlagPointer(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnable(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnableClientState(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnableVertexAttribArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glFogCoordPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glIndexPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glMultiTexCoordPointerEXT(_,_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glNormalPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glPixelStorei(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glPrimitiveRestartIndex(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glSecondaryColorPointer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribBinding(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribFormat(_,_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribIFormat(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribLFormat(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexBindingDivisor(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexPointer(_,_,_,_) ).Times(AnyNumber()); ppca.glPopClientAttrib( &ctx ); Mock::VerifyAndClear( &mock ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.glGetv(&ctx, GL_CLIENT_ATTRIB_STACK_DEPTH, &clientAttribStackDepth)); EXPECT_EQ( clientAttribStackDepth, GLint(0) ); EXPECT_EQ( std::vector::size_type(0), ppca.maskStack.size() ); EXPECT_EQ( std::vector::size_type(0), ppca.vertexArrayStack.size() ); EXPECT_EQ( std::vector::size_type(0), ppca.pixelStoreStack.size() ); EXPECT_CALL( mock, glClientAttribDefaultEXT( remainder ) ); EXPECT_CALL( mock, glBindBuffer(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glBindVertexArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glBindVertexBuffer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glClientActiveTexture(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glColorPointer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisable(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableClientState(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableClientStateiEXT(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableVertexAttribArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEdgeFlagPointer(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnable(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnableClientState(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnableVertexAttribArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glFogCoordPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glIndexPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glMultiTexCoordPointerEXT(_,_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glNormalPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glPixelStorei(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glPrimitiveRestartIndex(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glSecondaryColorPointer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribBinding(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribFormat(_,_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribIFormat(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribLFormat(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexBindingDivisor(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexPointer(_,_,_,_) ).Times(AnyNumber()); ppca.glClientAttribDefaultEXT( &ctx, GL_CLIENT_ALL_ATTRIB_BITS ); Mock::VerifyAndClear( &mock ); EXPECT_EQ( std::vector::size_type(0), ppca.maskStack.size() ); EXPECT_EQ( std::vector::size_type(0), ppca.vertexArrayStack.size() ); EXPECT_EQ( std::vector::size_type(0), ppca.pixelStoreStack.size() ); EXPECT_CALL( mock, glClientAttribDefaultEXT( remainder ) ); EXPECT_CALL( mock, glPushClientAttrib( remainder ) ); EXPECT_CALL( mock, glBindBuffer(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glBindVertexArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glBindVertexBuffer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glClientActiveTexture(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glColorPointer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisable(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableClientState(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableClientStateiEXT(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glDisableVertexAttribArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEdgeFlagPointer(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnable(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnableClientState(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glEnableVertexAttribArray(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glFogCoordPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glIndexPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glMultiTexCoordPointerEXT(_,_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glNormalPointer(_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glPixelStorei(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glPrimitiveRestartIndex(_) ).Times(AnyNumber()); EXPECT_CALL( mock, glSecondaryColorPointer(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribBinding(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribFormat(_,_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribIFormat(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexAttribLFormat(_,_,_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexBindingDivisor(_,_) ).Times(AnyNumber()); EXPECT_CALL( mock, glVertexPointer(_,_,_,_) ).Times(AnyNumber()); ppca.glPushClientAttribDefaultEXT( &ctx, GL_CLIENT_ALL_ATTRIB_BITS ); Mock::VerifyAndClear( &mock ); EXPECT_EQ( std::vector::size_type(1), ppca.maskStack.size() ); EXPECT_EQ( std::vector::size_type(1), ppca.vertexArrayStack.size() ); EXPECT_EQ( std::vector::size_type(1), ppca.pixelStoreStack.size() ); } TEST ( RegalPpca, VertexArray_Named_BasicOperations ) { RegalContext ctx; ctx.info = new ContextInfo(); Ppca state; checkPpcaDefaults(ctx, state); // Set unique data for the array source for all attributes. for (GLuint ii=0; ii(ii * 10 + 5); state.VertexArray::named[ii].buffer = GLuint(ii * 10 + 1); state.VertexArray::named[ii].size = GLint( ii * 10 + 2); state.VertexArray::named[ii].type = GLenum(ii * 10 + 3); state.VertexArray::named[ii].stride = GLuint(ii * 10 + 4); } // Calls with out-of-bound values should silently return as a no-op. // This is done here so if we affect the explicitly set state it will be // detected soon. state.glEnableClientState( GLenum(~0) ); state.glEnableClientStateiEXT( GL_TEXTURE_COORD_ARRAY, GLuint(~0) ); state.glDisableClientState( GLenum(~0) ); state.glDisableClientStateiEXT( GL_TEXTURE_COORD_ARRAY, GLuint(~0) ); state.glEnable( GLenum(~0) ); state.glEnable( GLenum(ClientState::nNamedArrays) ); state.glDisable( GLenum(~0) ); state.glDisable( GLenum(ClientState::nNamedArrays) ); // Peform a swap, so that it is effectively tested too Ppca other; checkPpcaDefaults(ctx, other); state.VertexArray::swap( other ); // Verify the expected default state ended up in the original checkPpcaDefaults(ctx, state); // Verify the modified data ended up in the other state for (GLuint ii=0; ii(ii * 10 + 5), other.VertexArray::named[ ii ].pointer ); EXPECT_EQ( GLuint(ii * 10 + 1), other.VertexArray::named[ ii ].buffer ); EXPECT_EQ( GLint( ii * 10 + 2), other.VertexArray::named[ ii ].size ); EXPECT_EQ( GLenum(ii * 10 + 3), other.VertexArray::named[ ii ].type ); EXPECT_EQ( GLuint(ii * 10 + 4), other.VertexArray::named[ ii ].stride ); } } TEST ( RegalPpca, VertexArray_Generic_BasicOperations ) { RegalContext ctx; ctx.info = new ContextInfo(); Ppca state; checkPpcaDefaults(ctx, state); // Set unique data for the arrays for (GLuint ii=0; ii( 321 ) ); EXPECT_EQ( GLuint(1), ppca.VertexArray::generic[3].size ); EXPECT_EQ( GLenum(GL_FLOAT), ppca.VertexArray::generic[3].type ); EXPECT_EQ( GLuint(0), ppca.VertexArray::generic[3].relativeOffset ); EXPECT_EQ( GLboolean(GL_TRUE), ppca.VertexArray::generic[3].normalized ); EXPECT_EQ( GLboolean(GL_FALSE), ppca.VertexArray::generic[3].isInteger ); EXPECT_EQ( GLboolean(GL_FALSE), ppca.VertexArray::generic[3].isLong ); EXPECT_EQ( GLuint(3), ppca.VertexArray::generic[3].bindingIndex ); EXPECT_EQ( GLuint(8888), ppca.VertexArray::bindings[3].buffer ); EXPECT_EQ( GLintptr(321), ppca.VertexArray::bindings[3].offset ); EXPECT_EQ( GLsizei(123), ppca.VertexArray::bindings[3].stride ); EXPECT_EQ( GLuint(0), ppca.VertexArray::bindings[3].divisor ); ppca.Reset(ctx); ppca.VertexArray::arrayBufferBinding = 8888; ppca.glVertexAttribPointer ( 3, 1, GL_FLOAT, GL_FALSE, 0, reinterpret_cast( 321 ) ); EXPECT_EQ( GLuint(1), ppca.VertexArray::generic[3].size ); EXPECT_EQ( GLenum(GL_FLOAT), ppca.VertexArray::generic[3].type ); EXPECT_EQ( GLuint(0), ppca.VertexArray::generic[3].relativeOffset ); EXPECT_EQ( GLboolean(GL_FALSE), ppca.VertexArray::generic[3].normalized ); EXPECT_EQ( GLboolean(GL_FALSE), ppca.VertexArray::generic[3].isInteger ); EXPECT_EQ( GLboolean(GL_FALSE), ppca.VertexArray::generic[3].isLong ); EXPECT_EQ( GLuint(3), ppca.VertexArray::generic[3].bindingIndex ); EXPECT_EQ( GLuint(8888), ppca.VertexArray::bindings[3].buffer ); EXPECT_EQ( GLintptr(321), ppca.VertexArray::bindings[3].offset ); EXPECT_EQ( GLsizei(4), ppca.VertexArray::bindings[3].stride ); EXPECT_EQ( GLuint(0), ppca.VertexArray::bindings[3].divisor ); ppca.Reset(ctx); ppca.VertexArray::arrayBufferBinding = 8888; ppca.glVertexAttribIPointer ( 3, 2, GL_INT, 456, reinterpret_cast( 654 ) ); EXPECT_EQ( GLuint(2), ppca.VertexArray::generic[3].size ); EXPECT_EQ( GLenum(GL_INT), ppca.VertexArray::generic[3].type ); EXPECT_EQ( GLuint(0), ppca.VertexArray::generic[3].relativeOffset ); EXPECT_EQ( GLboolean(GL_FALSE), ppca.VertexArray::generic[3].normalized ); EXPECT_EQ( GLboolean(GL_TRUE), ppca.VertexArray::generic[3].isInteger ); EXPECT_EQ( GLboolean(GL_FALSE), ppca.VertexArray::generic[3].isLong ); EXPECT_EQ( GLuint(3), ppca.VertexArray::generic[3].bindingIndex ); EXPECT_EQ( GLuint(8888), ppca.VertexArray::bindings[3].buffer ); EXPECT_EQ( GLintptr(654), ppca.VertexArray::bindings[3].offset ); EXPECT_EQ( GLsizei(456), ppca.VertexArray::bindings[3].stride ); EXPECT_EQ( GLuint(0), ppca.VertexArray::bindings[3].divisor ); ppca.Reset(ctx); ppca.VertexArray::arrayBufferBinding = 8888; ppca.glVertexAttribIPointer( 3, 2, GL_INT, 0, reinterpret_cast( 654 ) ); EXPECT_EQ( GLuint(2), ppca.VertexArray::generic[3].size ); EXPECT_EQ( GLenum(GL_INT), ppca.VertexArray::generic[3].type ); EXPECT_EQ( GLuint(0), ppca.VertexArray::generic[3].relativeOffset ); EXPECT_EQ( GLboolean(GL_FALSE), ppca.VertexArray::generic[3].normalized ); EXPECT_EQ( GLboolean(GL_TRUE), ppca.VertexArray::generic[3].isInteger ); EXPECT_EQ( GLboolean(GL_FALSE), ppca.VertexArray::generic[3].isLong ); EXPECT_EQ( GLuint(3), ppca.VertexArray::generic[3].bindingIndex ); EXPECT_EQ( GLuint(8888), ppca.VertexArray::bindings[3].buffer ); EXPECT_EQ( GLintptr(654), ppca.VertexArray::bindings[3].offset ); EXPECT_EQ( GLsizei(8), ppca.VertexArray::bindings[3].stride ); EXPECT_EQ( GLuint(0), ppca.VertexArray::bindings[3].divisor ); ppca.Reset(ctx); ppca.VertexArray::arrayBufferBinding = 8888; ppca.glVertexAttribLPointer( 3, 3, GL_DOUBLE, 789, reinterpret_cast( 987 ) ); EXPECT_EQ( GLuint(3), ppca.VertexArray::generic[3].size ); EXPECT_EQ( GLenum(GL_DOUBLE), ppca.VertexArray::generic[3].type ); EXPECT_EQ( GLuint(0), ppca.VertexArray::generic[3].relativeOffset ); EXPECT_EQ( GLboolean(GL_FALSE), ppca.VertexArray::generic[3].normalized ); EXPECT_EQ( GLboolean(GL_FALSE), ppca.VertexArray::generic[3].isInteger ); EXPECT_EQ( GLboolean(GL_TRUE), ppca.VertexArray::generic[3].isLong ); EXPECT_EQ( GLuint(3), ppca.VertexArray::generic[3].bindingIndex ); EXPECT_EQ( GLuint(8888), ppca.VertexArray::bindings[3].buffer ); EXPECT_EQ( GLintptr(987), ppca.VertexArray::bindings[3].offset ); EXPECT_EQ( GLsizei(789), ppca.VertexArray::bindings[3].stride ); EXPECT_EQ( GLuint(0), ppca.VertexArray::bindings[3].divisor ); ppca.VertexArray::arrayBufferBinding = 8888; ppca.glVertexAttribLPointer( 3, 3, GL_DOUBLE, 0, reinterpret_cast( 987 ) ); EXPECT_EQ( GLuint(3), ppca.VertexArray::generic[3].size ); EXPECT_EQ( GLenum(GL_DOUBLE), ppca.VertexArray::generic[3].type ); EXPECT_EQ( GLuint(0), ppca.VertexArray::generic[3].relativeOffset ); EXPECT_EQ( GLboolean(GL_FALSE), ppca.VertexArray::generic[3].normalized ); EXPECT_EQ( GLboolean(GL_FALSE), ppca.VertexArray::generic[3].isInteger ); EXPECT_EQ( GLboolean(GL_TRUE), ppca.VertexArray::generic[3].isLong ); EXPECT_EQ( GLuint(3), ppca.VertexArray::generic[3].bindingIndex ); EXPECT_EQ( GLuint(8888), ppca.VertexArray::bindings[3].buffer ); EXPECT_EQ( GLintptr(987), ppca.VertexArray::bindings[3].offset ); EXPECT_EQ( GLsizei(24), ppca.VertexArray::bindings[3].stride ); EXPECT_EQ( GLuint(0), ppca.VertexArray::bindings[3].divisor ); // Enable/DisableVertexAttribArray ppca.Reset(ctx); ppca.glEnableVertexAttribArray( 3 ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.VertexArray::generic[ 3 ].enabled ); ppca.glDisableVertexAttribArray( 3 ); EXPECT_EQ( GLboolean( GL_FALSE ), ppca.VertexArray::generic[ 3 ].enabled ); // VertexBindingDivisor ppca.Reset(ctx); ppca.glVertexBindingDivisor( 4, 123 ); EXPECT_EQ( GLuint(123), ppca.VertexArray::bindings[4].divisor ); // VertexAttribDivisor ppca.Reset(ctx); ppca.glVertexAttribDivisor( 3, 456 ); EXPECT_EQ( GLuint(3), ppca.VertexArray::generic[3].bindingIndex ); EXPECT_EQ( GLuint(456), ppca.VertexArray::bindings[3].divisor ); // ShadowVertexArrayVertexAttribOffsetEXT ppca.Reset(ctx); ppca.glVertexArrayVertexAttribOffsetEXT( 0, 987, 3, 1, GL_FLOAT, GL_TRUE, 123, 321 ); EXPECT_EQ( GLuint(1), ppca.VertexArray::generic[3].size ); EXPECT_EQ( GLenum(GL_FLOAT), ppca.VertexArray::generic[3].type ); EXPECT_EQ( GLuint( 0 ), ppca.VertexArray::generic[3].relativeOffset ); EXPECT_EQ( GLboolean(GL_TRUE), ppca.VertexArray::generic[3].normalized ); EXPECT_EQ( GLboolean(GL_FALSE), ppca.VertexArray::generic[3].isInteger ); EXPECT_EQ( GLboolean(GL_FALSE), ppca.VertexArray::generic[3].isLong ); EXPECT_EQ( GLuint(3), ppca.VertexArray::generic[3].bindingIndex ); EXPECT_EQ( GLuint(987), ppca.VertexArray::bindings[3].buffer ); EXPECT_EQ( GLintptr(321), ppca.VertexArray::bindings[3].offset ); EXPECT_EQ( GLsizei(123), ppca.VertexArray::bindings[3].stride ); EXPECT_EQ( GLuint(0), ppca.VertexArray::bindings[3].divisor ); ppca.Reset(ctx); ppca.glVertexArrayVertexAttribOffsetEXT( 0, 987, 3, 1, GL_FLOAT, GL_FALSE, 0, 321 ); EXPECT_EQ( GLuint(1), ppca.VertexArray::generic[3].size ); EXPECT_EQ( GLenum(GL_FLOAT), ppca.VertexArray::generic[3].type ); EXPECT_EQ( GLuint( 0 ), ppca.VertexArray::generic[3].relativeOffset ); EXPECT_EQ( GLboolean(GL_FALSE), ppca.VertexArray::generic[3].normalized ); EXPECT_EQ( GLboolean(GL_FALSE), ppca.VertexArray::generic[3].isInteger ); EXPECT_EQ( GLboolean(GL_FALSE), ppca.VertexArray::generic[3].isLong ); EXPECT_EQ( GLuint(3), ppca.VertexArray::generic[3].bindingIndex ); EXPECT_EQ( GLuint(987), ppca.VertexArray::bindings[3].buffer ); EXPECT_EQ( GLintptr(321), ppca.VertexArray::bindings[3].offset ); EXPECT_EQ( GLsizei(4), ppca.VertexArray::bindings[3].stride ); EXPECT_EQ( GLuint(0), ppca.VertexArray::bindings[3].divisor ); ppca.Reset(ctx); ppca.glVertexArrayVertexAttribIOffsetEXT( 0, 987, 3, 2, GL_INT, 456, 654 ); EXPECT_EQ( GLuint(2), ppca.VertexArray::generic[3].size ); EXPECT_EQ( GLenum(GL_INT), ppca.VertexArray::generic[3].type ); EXPECT_EQ( GLuint( 0 ), ppca.VertexArray::generic[3].relativeOffset ); EXPECT_EQ( GLboolean(GL_FALSE), ppca.VertexArray::generic[3].normalized ); EXPECT_EQ( GLboolean(GL_TRUE), ppca.VertexArray::generic[3].isInteger ); EXPECT_EQ( GLboolean(GL_FALSE), ppca.VertexArray::generic[3].isLong ); EXPECT_EQ( GLuint(3), ppca.VertexArray::generic[3].bindingIndex ); EXPECT_EQ( GLuint(987), ppca.VertexArray::bindings[3].buffer ); EXPECT_EQ( GLintptr(654), ppca.VertexArray::bindings[3].offset ); EXPECT_EQ( GLsizei(456), ppca.VertexArray::bindings[3].stride ); EXPECT_EQ( GLuint(0), ppca.VertexArray::bindings[3].divisor ); ppca.Reset(ctx); ppca.glVertexArrayVertexAttribIOffsetEXT( 0, 987, 3, 2, GL_INT, 0, 654 ); EXPECT_EQ( GLuint(2), ppca.VertexArray::generic[3].size ); EXPECT_EQ( GLenum(GL_INT), ppca.VertexArray::generic[3].type ); EXPECT_EQ( GLuint( 0 ), ppca.VertexArray::generic[3].relativeOffset ); EXPECT_EQ( GLboolean(GL_FALSE), ppca.VertexArray::generic[3].normalized ); EXPECT_EQ( GLboolean(GL_TRUE), ppca.VertexArray::generic[3].isInteger ); EXPECT_EQ( GLboolean(GL_FALSE), ppca.VertexArray::generic[3].isLong ); EXPECT_EQ( GLuint(3), ppca.VertexArray::generic[3].bindingIndex ); EXPECT_EQ( GLuint(987), ppca.VertexArray::bindings[3].buffer ); EXPECT_EQ( GLintptr(654), ppca.VertexArray::bindings[3].offset ); EXPECT_EQ( GLsizei(8), ppca.VertexArray::bindings[3].stride ); EXPECT_EQ( GLuint(0), ppca.VertexArray::bindings[3].divisor ); // EnableDisableVertexArrayAttribEXT ppca.Reset(ctx); ppca.glEnableVertexArrayAttribEXT( 0, 3 ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.VertexArray::generic [ 3 ].enabled ); ppca.glDisableVertexArrayAttribEXT( 0, 3 ); EXPECT_EQ( GLboolean( GL_FALSE ), ppca.VertexArray::generic [ 3 ].enabled ); // If the vertex array binding is nonzero, none of these calls should do // anything (since we do not actually track internal state for vertex array // objects. ppca.Reset(ctx); ppca.VertexArray::generic[ 3 ].relativeOffset = GLuint(123); ppca.VertexArray::generic[ 3 ].bindingIndex = 4; ppca.VertexArray::bindings[ 4 ].buffer = 456; ppca.VertexArray::bindings[ 4 ].divisor = 789; ppca.VertexArray::vertexArrayBinding = 1; ppca.glVertexAttribFormat ( 3, 3, GL_FLOAT, GL_TRUE, 0 ); ppca.glVertexAttribIFormat( 3, 3, GL_INT, 0 ); ppca.glVertexAttribLFormat( 3, 3, GL_DOUBLE, 0 ); ppca.glBindVertexBuffer( 4, 0, 0, 0 ); ppca.glVertexAttribBinding( 3, 0 ); ppca.glVertexAttribPointer ( 3, 1, GL_FLOAT, GL_TRUE, 0, NULL ); ppca.glVertexAttribIPointer( 3, 2, GL_INT, 0, NULL ); ppca.glVertexAttribLPointer( 3, 3, GL_DOUBLE, 0, NULL ); ppca.glVertexBindingDivisor( 4, 0 ); ppca.glVertexArrayVertexAttribOffsetEXT ( 1, 0, 3, 1, GL_FLOAT, GL_TRUE, 0, 0 ); ppca.glVertexArrayVertexAttribIOffsetEXT( 1, 0, 3, 2, GL_INT, 0, 0 ); EXPECT_EQ( GLuint(123), ppca.VertexArray::generic[3].relativeOffset ); EXPECT_EQ( GLuint(4), ppca.VertexArray::generic[3].bindingIndex ); EXPECT_EQ( GLuint(456), ppca.VertexArray::bindings[4].buffer ); EXPECT_EQ( GLuint(789), ppca.VertexArray::bindings[4].divisor ); ppca.VertexArray::generic [ 3 ].enabled = GL_FALSE; ppca.glEnableVertexAttribArray( 3 ); ppca.glEnableVertexArrayAttribEXT( 1, 3 ); EXPECT_EQ( GLboolean( GL_FALSE ), ppca.VertexArray::generic [ 3 ].enabled ); ppca.VertexArray::generic [ 3 ].enabled = GL_TRUE; ppca.glDisableVertexAttribArray( 3 ); ppca.glDisableVertexArrayAttribEXT( 1, 3 ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.VertexArray::generic [ 3 ].enabled ); } TEST ( RegalPpca, VertexArray_Named ) { RegalContext ctx; ctx.info = new ContextInfo(); Ppca ppca; checkPpcaDefaults(ctx, ppca); ppca.glEnableClientState( GL_COLOR_ARRAY ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.VertexArray::named[ ClientState::COLOR ].enabled ); ppca.glDisableClientState( GL_COLOR_ARRAY ); EXPECT_EQ( GLboolean( GL_FALSE ), ppca.VertexArray::named[ ClientState::COLOR ].enabled ); EXPECT_EQ( GLenum( GL_TEXTURE0 ), ppca.VertexArray::clientActiveTexture ); ppca.glClientActiveTexture( GL_TEXTURE2 ); EXPECT_EQ( GLenum( GL_TEXTURE2 ), ppca.VertexArray::clientActiveTexture ); ppca.glEnableClientState( GL_TEXTURE_COORD_ARRAY ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.VertexArray::named[ ClientState::TEX_COORD + 2 ].enabled ); ppca.glDisableClientState( GL_TEXTURE_COORD_ARRAY ); EXPECT_EQ( GLboolean( GL_FALSE ), ppca.VertexArray::named[ ClientState::TEX_COORD + 2 ].enabled ); ppca.glEnableVertexArrayEXT( 0, GL_TEXTURE_COORD_ARRAY ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.VertexArray::named[ ClientState::TEX_COORD + 2 ].enabled ); ppca.glDisableVertexArrayEXT( 0, GL_TEXTURE_COORD_ARRAY ); EXPECT_EQ( GLboolean( GL_FALSE ), ppca.VertexArray::named[ ClientState::TEX_COORD + 2 ].enabled ); ppca.glEnableVertexArrayEXT( 1, GL_TEXTURE_COORD_ARRAY ); EXPECT_EQ( GLboolean( GL_FALSE ), ppca.VertexArray::named[ ClientState::TEX_COORD + 2 ].enabled ); ppca.glDisableVertexArrayEXT( 1, GL_TEXTURE_COORD_ARRAY ); EXPECT_EQ( GLboolean( GL_FALSE ), ppca.VertexArray::named[ ClientState::TEX_COORD + 2 ].enabled ); ppca.glEnableClientStateIndexedEXT( GL_TEXTURE_COORD_ARRAY, 5 ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.VertexArray::named[ ClientState::TEX_COORD + 5 ].enabled ); ppca.glDisableClientStateIndexedEXT( GL_TEXTURE_COORD_ARRAY, 5 ); EXPECT_EQ( GLboolean( GL_FALSE ), ppca.VertexArray::named[ ClientState::TEX_COORD + 5 ].enabled ); for (GLuint ii=0; ii(ii); ppca.VertexArray::named[ii].buffer = GLuint(ii); ppca.VertexArray::named[ii].size = GLint(ii); ppca.VertexArray::named[ii].type = GLenum(ii); ppca.VertexArray::named[ii].stride = GLuint(ii); } ppca.VertexArray::arrayBufferBinding = 123; ppca.glVertexPointer( 4, GL_FLOAT, 1001, NULL ); EXPECT_EQ( GLuint(123), ppca.VertexArray::named[ ClientState::VERTEX ].buffer ); EXPECT_EQ( GLint(4), ppca.VertexArray::named[ ClientState::VERTEX ].size ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::VERTEX ].type ); EXPECT_EQ( GLint(1001), ppca.VertexArray::named[ ClientState::VERTEX ].stride ); ppca.glNormalPointer( GL_FLOAT, 1002, NULL ); EXPECT_EQ( GLuint(123), ppca.VertexArray::named[ ClientState::NORMAL ].buffer ); EXPECT_EQ( GLint(3), ppca.VertexArray::named[ ClientState::NORMAL ].size ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::NORMAL ].type ); EXPECT_EQ( GLint(1002), ppca.VertexArray::named[ ClientState::NORMAL ].stride ); ppca.glColorPointer( 4, GL_FLOAT, 1003, NULL ); EXPECT_EQ( GLuint(123), ppca.VertexArray::named[ ClientState::COLOR ].buffer ); EXPECT_EQ( GLint(4), ppca.VertexArray::named[ ClientState::COLOR ].size ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::COLOR ].type ); EXPECT_EQ( GLint(1003), ppca.VertexArray::named[ ClientState::COLOR ].stride ); ppca.glSecondaryColorPointer( 3, GL_FLOAT, 1004, NULL ); EXPECT_EQ( GLuint(123), ppca.VertexArray::named[ ClientState::SECONDARY_COLOR ].buffer ); EXPECT_EQ( GLint(3), ppca.VertexArray::named[ ClientState::SECONDARY_COLOR ].size ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::SECONDARY_COLOR ].type ); EXPECT_EQ( GLint(1004), ppca.VertexArray::named[ ClientState::SECONDARY_COLOR ].stride ); ppca.glIndexPointer( GL_INT, 1005, NULL ); EXPECT_EQ( GLuint(123), ppca.VertexArray::named[ ClientState::INDEX ].buffer ); EXPECT_EQ( GLint(1), ppca.VertexArray::named[ ClientState::INDEX ].size ); EXPECT_EQ( GLenum( GL_INT ), ppca.VertexArray::named[ ClientState::INDEX ].type ); EXPECT_EQ( GLint(1005), ppca.VertexArray::named[ ClientState::INDEX ].stride ); ppca.glEdgeFlagPointer( 1006, NULL ); EXPECT_EQ( GLuint(123), ppca.VertexArray::named[ ClientState::EDGE_FLAG ].buffer ); EXPECT_EQ( GLint(1), ppca.VertexArray::named[ ClientState::EDGE_FLAG ].size ); EXPECT_EQ( GLenum( GL_BOOL ), ppca.VertexArray::named[ ClientState::EDGE_FLAG ].type ); EXPECT_EQ( GLint(1006), ppca.VertexArray::named[ ClientState::EDGE_FLAG ].stride ); ppca.glFogCoordPointer( GL_FLOAT, 1007, NULL ); EXPECT_EQ( GLuint(123), ppca.VertexArray::named[ ClientState::FOG_COORD ].buffer ); EXPECT_EQ( GLint(1), ppca.VertexArray::named[ ClientState::FOG_COORD ].size ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::FOG_COORD ].type ); EXPECT_EQ( GLint(1007), ppca.VertexArray::named[ ClientState::FOG_COORD ].stride ); ppca.glTexCoordPointer( 2, GL_FLOAT, 1008, NULL ); EXPECT_EQ( GLuint(123), ppca.VertexArray::named[ ClientState::TEX_COORD + 2].buffer ); EXPECT_EQ( GLint(2), ppca.VertexArray::named[ ClientState::TEX_COORD + 2].size ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::TEX_COORD + 2].type ); EXPECT_EQ( GLint(1008), ppca.VertexArray::named[ ClientState::TEX_COORD + 2].stride ); ppca.glMultiTexCoordPointerEXT( GL_TEXTURE5, 2, GL_FLOAT, 2005, NULL ); EXPECT_EQ( GLuint(123), ppca.VertexArray::named[ ClientState::TEX_COORD + 5].buffer ); EXPECT_EQ( GLint(2), ppca.VertexArray::named[ ClientState::TEX_COORD + 5].size ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::TEX_COORD + 5].type ); EXPECT_EQ( GLint(2005), ppca.VertexArray::named[ ClientState::TEX_COORD + 5].stride ); ppca.glVertexArrayVertexOffsetEXT( 0, 3001, 3, GL_FLOAT, 3002, 0 ); EXPECT_EQ( GLuint(3001), ppca.VertexArray::named[ ClientState::VERTEX ].buffer ); EXPECT_EQ( GLint(3), ppca.VertexArray::named[ ClientState::VERTEX ].size ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::VERTEX ].type ); EXPECT_EQ( GLint(3002), ppca.VertexArray::named[ ClientState::VERTEX ].stride ); ppca.glVertexArrayColorOffsetEXT ( 0, 3003, 4, GL_FLOAT, 3004, 0 ); EXPECT_EQ( GLuint(3003), ppca.VertexArray::named[ ClientState::COLOR ].buffer ); EXPECT_EQ( GLint(4), ppca.VertexArray::named[ ClientState::COLOR ].size ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::COLOR ].type ); EXPECT_EQ( GLint(3004), ppca.VertexArray::named[ ClientState::COLOR ].stride ); ppca.glVertexArrayEdgeFlagOffsetEXT ( 0, 3005, 3006, 0 ); EXPECT_EQ( GLuint(3005), ppca.VertexArray::named[ ClientState::EDGE_FLAG ].buffer ); EXPECT_EQ( GLint(1), ppca.VertexArray::named[ ClientState::EDGE_FLAG ].size ); EXPECT_EQ( GLenum( GL_BOOL ), ppca.VertexArray::named[ ClientState::EDGE_FLAG ].type ); EXPECT_EQ( GLint(3006), ppca.VertexArray::named[ ClientState::EDGE_FLAG ].stride ); ppca.glVertexArrayIndexOffsetEXT ( 0, 3007, GL_INT, 3008, 0 ); EXPECT_EQ( GLuint(3007), ppca.VertexArray::named[ ClientState::INDEX ].buffer ); EXPECT_EQ( GLint(1), ppca.VertexArray::named[ ClientState::INDEX ].size ); EXPECT_EQ( GLenum( GL_INT ), ppca.VertexArray::named[ ClientState::INDEX ].type ); EXPECT_EQ( GLint(3008), ppca.VertexArray::named[ ClientState::INDEX ].stride ); ppca.glVertexArrayNormalOffsetEXT ( 0, 3009, GL_FLOAT, 3010, 0 ); EXPECT_EQ( GLuint(3009), ppca.VertexArray::named[ ClientState::NORMAL ].buffer ); EXPECT_EQ( GLint(3), ppca.VertexArray::named[ ClientState::NORMAL ].size ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::NORMAL ].type ); EXPECT_EQ( GLint(3010), ppca.VertexArray::named[ ClientState::NORMAL ].stride ); ppca.glVertexArrayTexCoordOffsetEXT( 0, 3011, 2, GL_FLOAT, 3012, 0 ); EXPECT_EQ( GLuint(3011), ppca.VertexArray::named[ ClientState::TEX_COORD + 2 ].buffer ); EXPECT_EQ( GLint(2), ppca.VertexArray::named[ ClientState::TEX_COORD + 2 ].size ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::TEX_COORD + 2 ].type ); EXPECT_EQ( GLint(3012), ppca.VertexArray::named[ ClientState::TEX_COORD + 2 ].stride ); ppca.glVertexArrayMultiTexCoordOffsetEXT( 0, 3013, GL_TEXTURE5, 2, GL_FLOAT, 3014, 0 ); EXPECT_EQ( GLuint(3013), ppca.VertexArray::named[ ClientState::TEX_COORD + 5 ].buffer ); EXPECT_EQ( GLint(2), ppca.VertexArray::named[ ClientState::TEX_COORD + 5 ].size ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::TEX_COORD + 5 ].type ); EXPECT_EQ( GLint(3014), ppca.VertexArray::named[ ClientState::TEX_COORD + 5 ].stride ); ppca.glVertexArrayFogCoordOffsetEXT ( 0, 3015, GL_FLOAT, 3016, 0 ); EXPECT_EQ( GLuint(3015), ppca.VertexArray::named[ ClientState::FOG_COORD ].buffer ); EXPECT_EQ( GLint(1), ppca.VertexArray::named[ ClientState::FOG_COORD ].size ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::FOG_COORD ].type ); EXPECT_EQ( GLint(3016), ppca.VertexArray::named[ ClientState::FOG_COORD ].stride ); ppca.glVertexArraySecondaryColorOffsetEXT ( 0, 3017, 3, GL_FLOAT, 3018, 0 ); EXPECT_EQ( GLuint(3017), ppca.VertexArray::named[ ClientState::SECONDARY_COLOR ].buffer ); EXPECT_EQ( GLint(3), ppca.VertexArray::named[ ClientState::SECONDARY_COLOR ].size ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::SECONDARY_COLOR ].type ); EXPECT_EQ( GLint(3018), ppca.VertexArray::named[ ClientState::SECONDARY_COLOR ].stride ); } TEST ( RegalPpca, glDeleteBuffers_Shadowing ) { RegalContext ctx; ctx.info = new ContextInfo(); Ppca ppca; checkPpcaDefaults(ctx, ppca); GLuint buffers[ 2 ] = { 0, 123 }; for (GLuint ii=0; ii( 987 ); } ppca.glClientActiveTexture( GL_TEXTURE5 ); ppca.glInterleavedArrays( GL_T4F_C4F_N3F_V4F, 0, NULL ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.VertexArray::named[ ClientState::VERTEX ].enabled ); EXPECT_EQ( GLint( 4 ), ppca.VertexArray::named[ ClientState::VERTEX ].size ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::VERTEX ].type ); EXPECT_EQ( GLint( 60 ), ppca.VertexArray::named[ ClientState::VERTEX ].stride ); EXPECT_EQ( reinterpret_cast( 44 ), ppca.VertexArray::named[ ClientState::VERTEX ].pointer ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.VertexArray::named[ ClientState::NORMAL ].enabled ); EXPECT_EQ( GLint( 3 ), ppca.VertexArray::named[ ClientState::NORMAL ].size ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::NORMAL ].type ); EXPECT_EQ( GLint( 60 ), ppca.VertexArray::named[ ClientState::NORMAL ].stride ); EXPECT_EQ( reinterpret_cast( 32 ), ppca.VertexArray::named[ ClientState::NORMAL ].pointer ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.VertexArray::named[ ClientState::COLOR ].enabled ); EXPECT_EQ( GLint( 4 ), ppca.VertexArray::named[ ClientState::COLOR ].size ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::COLOR ].type ); EXPECT_EQ( GLint( 60 ), ppca.VertexArray::named[ ClientState::COLOR ].stride ); EXPECT_EQ( reinterpret_cast( 16 ), ppca.VertexArray::named[ ClientState::COLOR ].pointer ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.VertexArray::named[ ClientState::TEX_COORD + 5 ].enabled ); EXPECT_EQ( GLint( 4 ), ppca.VertexArray::named[ ClientState::TEX_COORD + 5 ].size ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::TEX_COORD + 5 ].type ); EXPECT_EQ( GLint( 60 ), ppca.VertexArray::named[ ClientState::TEX_COORD + 5 ].stride ); EXPECT_EQ( reinterpret_cast( 0 ), ppca.VertexArray::named[ ClientState::TEX_COORD + 5 ].pointer ); // The other non-texture coordinate arrays should be disabled EXPECT_EQ( GLboolean( GL_FALSE ), ppca.VertexArray::named[ ClientState::EDGE_FLAG ].enabled ); EXPECT_EQ( GLboolean( GL_FALSE ), ppca.VertexArray::named[ ClientState::FOG_COORD ].enabled ); EXPECT_EQ( GLboolean( GL_FALSE ), ppca.VertexArray::named[ ClientState::INDEX ].enabled ); EXPECT_EQ( GLboolean( GL_FALSE ), ppca.VertexArray::named[ ClientState::SECONDARY_COLOR ].enabled ); // The other non-texture coordinate arrays should not otherwise be touched. EXPECT_EQ( GLint( 987 ), ppca.VertexArray::named[ ClientState::EDGE_FLAG ].size ); EXPECT_EQ( GLenum( 987 ), ppca.VertexArray::named[ ClientState::EDGE_FLAG ].type ); EXPECT_EQ( GLint( 987 ), ppca.VertexArray::named[ ClientState::EDGE_FLAG ].stride ); EXPECT_EQ( reinterpret_cast( 987 ), ppca.VertexArray::named[ ClientState::EDGE_FLAG ].pointer ); EXPECT_EQ( GLint( 987 ), ppca.VertexArray::named[ ClientState::FOG_COORD ].size ); EXPECT_EQ( GLenum( 987 ), ppca.VertexArray::named[ ClientState::FOG_COORD ].type ); EXPECT_EQ( GLint( 987 ), ppca.VertexArray::named[ ClientState::FOG_COORD ].stride ); EXPECT_EQ( reinterpret_cast( 987 ), ppca.VertexArray::named[ ClientState::FOG_COORD ].pointer ); EXPECT_EQ( GLint( 987 ), ppca.VertexArray::named[ ClientState::INDEX ].size ); EXPECT_EQ( GLenum( 987 ), ppca.VertexArray::named[ ClientState::INDEX ].type ); EXPECT_EQ( GLint( 987 ), ppca.VertexArray::named[ ClientState::INDEX ].stride ); EXPECT_EQ( reinterpret_cast( 987 ), ppca.VertexArray::named[ ClientState::INDEX ].pointer ); EXPECT_EQ( GLint( 987 ), ppca.VertexArray::named[ ClientState::SECONDARY_COLOR ].size ); EXPECT_EQ( GLenum( 987 ), ppca.VertexArray::named[ ClientState::SECONDARY_COLOR ].type ); EXPECT_EQ( GLint( 987 ), ppca.VertexArray::named[ ClientState::SECONDARY_COLOR ].stride ); EXPECT_EQ( reinterpret_cast( 987 ), ppca.VertexArray::named[ ClientState::SECONDARY_COLOR ].pointer ); // Verify other texture coordinate settings unaffected. for (GLuint ii=0; ii( 987 ), ppca.VertexArray::named[ ClientState::TEX_COORD + ii ].pointer ); } // Ensure if stride is nonzero, it is used as is, and ensure the pointer passed in is used as a base address. ppca.Reset(ctx); checkPpcaDefaults(ctx, ppca); ppca.glClientActiveTexture( GL_TEXTURE5 ); ppca.glInterleavedArrays( GL_T4F_C4F_N3F_V4F, 321, reinterpret_cast( 5000 ) ); EXPECT_EQ( GLint( 321 ), ppca.VertexArray::named[ ClientState::VERTEX ].stride ); EXPECT_EQ( reinterpret_cast( 5044 ), ppca.VertexArray::named[ ClientState::VERTEX ].pointer ); EXPECT_EQ( GLint( 321 ), ppca.VertexArray::named[ ClientState::NORMAL ].stride ); EXPECT_EQ( reinterpret_cast( 5032 ), ppca.VertexArray::named[ ClientState::NORMAL ].pointer ); EXPECT_EQ( GLint( 321 ), ppca.VertexArray::named[ ClientState::COLOR ].stride ); EXPECT_EQ( reinterpret_cast( 5016 ), ppca.VertexArray::named[ ClientState::COLOR ].pointer ); EXPECT_EQ( GLint( 321 ), ppca.VertexArray::named[ ClientState::TEX_COORD + 5 ].stride ); EXPECT_EQ( reinterpret_cast( 5000 ), ppca.VertexArray::named[ ClientState::TEX_COORD + 5 ].pointer ); // Do a quick run through the remaining formats, and do some quick verifications. ppca.Reset(ctx); checkPpcaDefaults(ctx, ppca); ppca.glInterleavedArrays( GL_V2F, 0, NULL ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.VertexArray::named[ ClientState::VERTEX ].enabled ); EXPECT_EQ( GLboolean( GL_FALSE ), ppca.VertexArray::named[ ClientState::NORMAL ].enabled ); EXPECT_EQ( GLboolean( GL_FALSE ), ppca.VertexArray::named[ ClientState::COLOR ].enabled ); EXPECT_EQ( GLboolean( GL_FALSE ), ppca.VertexArray::named[ ClientState::TEX_COORD ].enabled ); EXPECT_EQ( GLint( 2 ), ppca.VertexArray::named[ ClientState::VERTEX ].size ); EXPECT_EQ( GLint( 3 ), ppca.VertexArray::named[ ClientState::NORMAL ].size ); EXPECT_EQ( GLint( 4 ), ppca.VertexArray::named[ ClientState::COLOR ].size ); EXPECT_EQ( GLint( 4 ), ppca.VertexArray::named[ ClientState::TEX_COORD ].size ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::VERTEX ].type ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::NORMAL ].type ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::COLOR ].type ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::TEX_COORD ].type ); EXPECT_EQ( GLint( 8 ), ppca.VertexArray::named[ ClientState::VERTEX ].stride ); EXPECT_EQ( GLint( 0 ), ppca.VertexArray::named[ ClientState::NORMAL ].stride ); EXPECT_EQ( GLint( 0 ), ppca.VertexArray::named[ ClientState::COLOR ].stride ); EXPECT_EQ( GLint( 0 ), ppca.VertexArray::named[ ClientState::TEX_COORD ].stride ); EXPECT_EQ( reinterpret_cast( 0 ), ppca.VertexArray::named[ ClientState::VERTEX ].pointer ); EXPECT_EQ( reinterpret_cast( 0 ), ppca.VertexArray::named[ ClientState::NORMAL ].pointer ); EXPECT_EQ( reinterpret_cast( 0 ), ppca.VertexArray::named[ ClientState::COLOR ].pointer ); EXPECT_EQ( reinterpret_cast( 0 ), ppca.VertexArray::named[ ClientState::TEX_COORD ].pointer ); ppca.Reset(ctx); checkPpcaDefaults(ctx, ppca); ppca.glInterleavedArrays( GL_V3F, 0, NULL ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.VertexArray::named[ ClientState::VERTEX ].enabled ); EXPECT_EQ( GLboolean( GL_FALSE ), ppca.VertexArray::named[ ClientState::NORMAL ].enabled ); EXPECT_EQ( GLboolean( GL_FALSE ), ppca.VertexArray::named[ ClientState::COLOR ].enabled ); EXPECT_EQ( GLboolean( GL_FALSE ), ppca.VertexArray::named[ ClientState::TEX_COORD ].enabled ); EXPECT_EQ( GLint( 3 ), ppca.VertexArray::named[ ClientState::VERTEX ].size ); EXPECT_EQ( GLint( 3 ), ppca.VertexArray::named[ ClientState::NORMAL ].size ); EXPECT_EQ( GLint( 4 ), ppca.VertexArray::named[ ClientState::COLOR ].size ); EXPECT_EQ( GLint( 4 ), ppca.VertexArray::named[ ClientState::TEX_COORD ].size ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::VERTEX ].type ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::NORMAL ].type ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::COLOR ].type ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::TEX_COORD ].type ); EXPECT_EQ( GLint( 12 ), ppca.VertexArray::named[ ClientState::VERTEX ].stride ); EXPECT_EQ( GLint( 0 ), ppca.VertexArray::named[ ClientState::NORMAL ].stride ); EXPECT_EQ( GLint( 0 ), ppca.VertexArray::named[ ClientState::COLOR ].stride ); EXPECT_EQ( GLint( 0 ), ppca.VertexArray::named[ ClientState::TEX_COORD ].stride ); EXPECT_EQ( reinterpret_cast( 0 ), ppca.VertexArray::named[ ClientState::VERTEX ].pointer ); EXPECT_EQ( reinterpret_cast( 0 ), ppca.VertexArray::named[ ClientState::NORMAL ].pointer ); EXPECT_EQ( reinterpret_cast( 0 ), ppca.VertexArray::named[ ClientState::COLOR ].pointer ); EXPECT_EQ( reinterpret_cast( 0 ), ppca.VertexArray::named[ ClientState::TEX_COORD ].pointer ); ppca.Reset(ctx); checkPpcaDefaults(ctx, ppca); ppca.glInterleavedArrays( GL_C4UB_V2F, 0, NULL ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.VertexArray::named[ ClientState::VERTEX ].enabled ); EXPECT_EQ( GLboolean( GL_FALSE ), ppca.VertexArray::named[ ClientState::NORMAL ].enabled ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.VertexArray::named[ ClientState::COLOR ].enabled ); EXPECT_EQ( GLboolean( GL_FALSE ), ppca.VertexArray::named[ ClientState::TEX_COORD ].enabled ); EXPECT_EQ( GLint( 2 ), ppca.VertexArray::named[ ClientState::VERTEX ].size ); EXPECT_EQ( GLint( 3 ), ppca.VertexArray::named[ ClientState::NORMAL ].size ); EXPECT_EQ( GLint( 4 ), ppca.VertexArray::named[ ClientState::COLOR ].size ); EXPECT_EQ( GLint( 4 ), ppca.VertexArray::named[ ClientState::TEX_COORD ].size ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::VERTEX ].type ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::NORMAL ].type ); EXPECT_EQ( GLenum( GL_UNSIGNED_BYTE ), ppca.VertexArray::named[ ClientState::COLOR ].type ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::TEX_COORD ].type ); EXPECT_EQ( GLint( 12 ), ppca.VertexArray::named[ ClientState::VERTEX ].stride ); EXPECT_EQ( GLint( 0 ), ppca.VertexArray::named[ ClientState::NORMAL ].stride ); EXPECT_EQ( GLint( 12 ), ppca.VertexArray::named[ ClientState::COLOR ].stride ); EXPECT_EQ( GLint( 0 ), ppca.VertexArray::named[ ClientState::TEX_COORD ].stride ); EXPECT_EQ( reinterpret_cast( 4 ), ppca.VertexArray::named[ ClientState::VERTEX ].pointer ); EXPECT_EQ( reinterpret_cast( 0 ), ppca.VertexArray::named[ ClientState::NORMAL ].pointer ); EXPECT_EQ( reinterpret_cast( 0 ), ppca.VertexArray::named[ ClientState::COLOR ].pointer ); EXPECT_EQ( reinterpret_cast( 0 ), ppca.VertexArray::named[ ClientState::TEX_COORD ].pointer ); ppca.Reset(ctx); checkPpcaDefaults(ctx, ppca); ppca.glInterleavedArrays( GL_C4UB_V3F, 0, NULL ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.VertexArray::named[ ClientState::VERTEX ].enabled ); EXPECT_EQ( GLboolean( GL_FALSE ), ppca.VertexArray::named[ ClientState::NORMAL ].enabled ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.VertexArray::named[ ClientState::COLOR ].enabled ); EXPECT_EQ( GLboolean( GL_FALSE ), ppca.VertexArray::named[ ClientState::TEX_COORD ].enabled ); EXPECT_EQ( GLint( 3 ), ppca.VertexArray::named[ ClientState::VERTEX ].size ); EXPECT_EQ( GLint( 3 ), ppca.VertexArray::named[ ClientState::NORMAL ].size ); EXPECT_EQ( GLint( 4 ), ppca.VertexArray::named[ ClientState::COLOR ].size ); EXPECT_EQ( GLint( 4 ), ppca.VertexArray::named[ ClientState::TEX_COORD ].size ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::VERTEX ].type ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::NORMAL ].type ); EXPECT_EQ( GLenum( GL_UNSIGNED_BYTE ), ppca.VertexArray::named[ ClientState::COLOR ].type ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::TEX_COORD ].type ); EXPECT_EQ( GLint( 16 ), ppca.VertexArray::named[ ClientState::VERTEX ].stride ); EXPECT_EQ( GLint( 0 ), ppca.VertexArray::named[ ClientState::NORMAL ].stride ); EXPECT_EQ( GLint( 16 ), ppca.VertexArray::named[ ClientState::COLOR ].stride ); EXPECT_EQ( GLint( 0 ), ppca.VertexArray::named[ ClientState::TEX_COORD ].stride ); EXPECT_EQ( reinterpret_cast( 4 ), ppca.VertexArray::named[ ClientState::VERTEX ].pointer ); EXPECT_EQ( reinterpret_cast( 0 ), ppca.VertexArray::named[ ClientState::NORMAL ].pointer ); EXPECT_EQ( reinterpret_cast( 0 ), ppca.VertexArray::named[ ClientState::COLOR ].pointer ); EXPECT_EQ( reinterpret_cast( 0 ), ppca.VertexArray::named[ ClientState::TEX_COORD ].pointer ); ppca.Reset(ctx); checkPpcaDefaults(ctx, ppca); ppca.glInterleavedArrays( GL_C3F_V3F, 0, NULL ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.VertexArray::named[ ClientState::VERTEX ].enabled ); EXPECT_EQ( GLboolean( GL_FALSE ), ppca.VertexArray::named[ ClientState::NORMAL ].enabled ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.VertexArray::named[ ClientState::COLOR ].enabled ); EXPECT_EQ( GLboolean( GL_FALSE ), ppca.VertexArray::named[ ClientState::TEX_COORD ].enabled ); EXPECT_EQ( GLint( 3 ), ppca.VertexArray::named[ ClientState::VERTEX ].size ); EXPECT_EQ( GLint( 3 ), ppca.VertexArray::named[ ClientState::NORMAL ].size ); EXPECT_EQ( GLint( 3 ), ppca.VertexArray::named[ ClientState::COLOR ].size ); EXPECT_EQ( GLint( 4 ), ppca.VertexArray::named[ ClientState::TEX_COORD ].size ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::VERTEX ].type ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::NORMAL ].type ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::COLOR ].type ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::TEX_COORD ].type ); EXPECT_EQ( GLint( 24 ), ppca.VertexArray::named[ ClientState::VERTEX ].stride ); EXPECT_EQ( GLint( 0 ), ppca.VertexArray::named[ ClientState::NORMAL ].stride ); EXPECT_EQ( GLint( 24 ), ppca.VertexArray::named[ ClientState::COLOR ].stride ); EXPECT_EQ( GLint( 0 ), ppca.VertexArray::named[ ClientState::TEX_COORD ].stride ); EXPECT_EQ( reinterpret_cast( 12 ), ppca.VertexArray::named[ ClientState::VERTEX ].pointer ); EXPECT_EQ( reinterpret_cast( 0 ), ppca.VertexArray::named[ ClientState::NORMAL ].pointer ); EXPECT_EQ( reinterpret_cast( 0 ), ppca.VertexArray::named[ ClientState::COLOR ].pointer ); EXPECT_EQ( reinterpret_cast( 0 ), ppca.VertexArray::named[ ClientState::TEX_COORD ].pointer ); ppca.Reset(ctx); checkPpcaDefaults(ctx, ppca); ppca.glInterleavedArrays( GL_N3F_V3F, 0, NULL ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.VertexArray::named[ ClientState::VERTEX ].enabled ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.VertexArray::named[ ClientState::NORMAL ].enabled ); EXPECT_EQ( GLboolean( GL_FALSE ), ppca.VertexArray::named[ ClientState::COLOR ].enabled ); EXPECT_EQ( GLboolean( GL_FALSE ), ppca.VertexArray::named[ ClientState::TEX_COORD ].enabled ); EXPECT_EQ( GLint( 3 ), ppca.VertexArray::named[ ClientState::VERTEX ].size ); EXPECT_EQ( GLint( 3 ), ppca.VertexArray::named[ ClientState::NORMAL ].size ); EXPECT_EQ( GLint( 4 ), ppca.VertexArray::named[ ClientState::COLOR ].size ); EXPECT_EQ( GLint( 4 ), ppca.VertexArray::named[ ClientState::TEX_COORD ].size ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::VERTEX ].type ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::NORMAL ].type ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::COLOR ].type ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::TEX_COORD ].type ); EXPECT_EQ( GLint( 24 ), ppca.VertexArray::named[ ClientState::VERTEX ].stride ); EXPECT_EQ( GLint( 24 ), ppca.VertexArray::named[ ClientState::NORMAL ].stride ); EXPECT_EQ( GLint( 0 ), ppca.VertexArray::named[ ClientState::COLOR ].stride ); EXPECT_EQ( GLint( 0 ), ppca.VertexArray::named[ ClientState::TEX_COORD ].stride ); EXPECT_EQ( reinterpret_cast( 12 ), ppca.VertexArray::named[ ClientState::VERTEX ].pointer ); EXPECT_EQ( reinterpret_cast( 0 ), ppca.VertexArray::named[ ClientState::NORMAL ].pointer ); EXPECT_EQ( reinterpret_cast( 0 ), ppca.VertexArray::named[ ClientState::COLOR ].pointer ); EXPECT_EQ( reinterpret_cast( 0 ), ppca.VertexArray::named[ ClientState::TEX_COORD ].pointer ); ppca.Reset(ctx); checkPpcaDefaults(ctx, ppca); ppca.glInterleavedArrays( GL_C4F_N3F_V3F, 0, NULL ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.VertexArray::named[ ClientState::VERTEX ].enabled ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.VertexArray::named[ ClientState::NORMAL ].enabled ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.VertexArray::named[ ClientState::COLOR ].enabled ); EXPECT_EQ( GLboolean( GL_FALSE ), ppca.VertexArray::named[ ClientState::TEX_COORD ].enabled ); EXPECT_EQ( GLint( 3 ), ppca.VertexArray::named[ ClientState::VERTEX ].size ); EXPECT_EQ( GLint( 3 ), ppca.VertexArray::named[ ClientState::NORMAL ].size ); EXPECT_EQ( GLint( 4 ), ppca.VertexArray::named[ ClientState::COLOR ].size ); EXPECT_EQ( GLint( 4 ), ppca.VertexArray::named[ ClientState::TEX_COORD ].size ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::VERTEX ].type ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::NORMAL ].type ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::COLOR ].type ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::TEX_COORD ].type ); EXPECT_EQ( GLint( 40 ), ppca.VertexArray::named[ ClientState::VERTEX ].stride ); EXPECT_EQ( GLint( 40 ), ppca.VertexArray::named[ ClientState::NORMAL ].stride ); EXPECT_EQ( GLint( 40 ), ppca.VertexArray::named[ ClientState::COLOR ].stride ); EXPECT_EQ( GLint( 0 ), ppca.VertexArray::named[ ClientState::TEX_COORD ].stride ); EXPECT_EQ( reinterpret_cast( 28 ), ppca.VertexArray::named[ ClientState::VERTEX ].pointer ); EXPECT_EQ( reinterpret_cast( 16 ), ppca.VertexArray::named[ ClientState::NORMAL ].pointer ); EXPECT_EQ( reinterpret_cast( 0 ), ppca.VertexArray::named[ ClientState::COLOR ].pointer ); EXPECT_EQ( reinterpret_cast( 0 ), ppca.VertexArray::named[ ClientState::TEX_COORD ].pointer ); ppca.Reset(ctx); checkPpcaDefaults(ctx, ppca); ppca.glInterleavedArrays( GL_T2F_V3F, 0, NULL ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.VertexArray::named[ ClientState::VERTEX ].enabled ); EXPECT_EQ( GLboolean( GL_FALSE ), ppca.VertexArray::named[ ClientState::NORMAL ].enabled ); EXPECT_EQ( GLboolean( GL_FALSE ), ppca.VertexArray::named[ ClientState::COLOR ].enabled ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.VertexArray::named[ ClientState::TEX_COORD ].enabled ); EXPECT_EQ( GLint( 3 ), ppca.VertexArray::named[ ClientState::VERTEX ].size ); EXPECT_EQ( GLint( 3 ), ppca.VertexArray::named[ ClientState::NORMAL ].size ); EXPECT_EQ( GLint( 4 ), ppca.VertexArray::named[ ClientState::COLOR ].size ); EXPECT_EQ( GLint( 2 ), ppca.VertexArray::named[ ClientState::TEX_COORD ].size ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::VERTEX ].type ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::NORMAL ].type ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::COLOR ].type ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::TEX_COORD ].type ); EXPECT_EQ( GLint( 20 ), ppca.VertexArray::named[ ClientState::VERTEX ].stride ); EXPECT_EQ( GLint( 0 ), ppca.VertexArray::named[ ClientState::NORMAL ].stride ); EXPECT_EQ( GLint( 0 ), ppca.VertexArray::named[ ClientState::COLOR ].stride ); EXPECT_EQ( GLint( 20 ), ppca.VertexArray::named[ ClientState::TEX_COORD ].stride ); EXPECT_EQ( reinterpret_cast( 8 ), ppca.VertexArray::named[ ClientState::VERTEX ].pointer ); EXPECT_EQ( reinterpret_cast( 0 ), ppca.VertexArray::named[ ClientState::NORMAL ].pointer ); EXPECT_EQ( reinterpret_cast( 0 ), ppca.VertexArray::named[ ClientState::COLOR ].pointer ); EXPECT_EQ( reinterpret_cast( 0 ), ppca.VertexArray::named[ ClientState::TEX_COORD ].pointer ); ppca.Reset(ctx); checkPpcaDefaults(ctx, ppca); ppca.glInterleavedArrays( GL_T4F_V4F, 0, NULL ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.VertexArray::named[ ClientState::VERTEX ].enabled ); EXPECT_EQ( GLboolean( GL_FALSE ), ppca.VertexArray::named[ ClientState::NORMAL ].enabled ); EXPECT_EQ( GLboolean( GL_FALSE ), ppca.VertexArray::named[ ClientState::COLOR ].enabled ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.VertexArray::named[ ClientState::TEX_COORD ].enabled ); EXPECT_EQ( GLint( 4 ), ppca.VertexArray::named[ ClientState::VERTEX ].size ); EXPECT_EQ( GLint( 3 ), ppca.VertexArray::named[ ClientState::NORMAL ].size ); EXPECT_EQ( GLint( 4 ), ppca.VertexArray::named[ ClientState::COLOR ].size ); EXPECT_EQ( GLint( 4 ), ppca.VertexArray::named[ ClientState::TEX_COORD ].size ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::VERTEX ].type ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::NORMAL ].type ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::COLOR ].type ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::TEX_COORD ].type ); EXPECT_EQ( GLint( 32 ), ppca.VertexArray::named[ ClientState::VERTEX ].stride ); EXPECT_EQ( GLint( 0 ), ppca.VertexArray::named[ ClientState::NORMAL ].stride ); EXPECT_EQ( GLint( 0 ), ppca.VertexArray::named[ ClientState::COLOR ].stride ); EXPECT_EQ( GLint( 32 ), ppca.VertexArray::named[ ClientState::TEX_COORD ].stride ); EXPECT_EQ( reinterpret_cast( 16 ), ppca.VertexArray::named[ ClientState::VERTEX ].pointer ); EXPECT_EQ( reinterpret_cast( 0 ), ppca.VertexArray::named[ ClientState::NORMAL ].pointer ); EXPECT_EQ( reinterpret_cast( 0 ), ppca.VertexArray::named[ ClientState::COLOR ].pointer ); EXPECT_EQ( reinterpret_cast( 0 ), ppca.VertexArray::named[ ClientState::TEX_COORD ].pointer ); ppca.Reset(ctx); checkPpcaDefaults(ctx, ppca); ppca.glInterleavedArrays( GL_T2F_C4UB_V3F, 0, NULL ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.VertexArray::named[ ClientState::VERTEX ].enabled ); EXPECT_EQ( GLboolean( GL_FALSE ), ppca.VertexArray::named[ ClientState::NORMAL ].enabled ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.VertexArray::named[ ClientState::COLOR ].enabled ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.VertexArray::named[ ClientState::TEX_COORD ].enabled ); EXPECT_EQ( GLint( 3 ), ppca.VertexArray::named[ ClientState::VERTEX ].size ); EXPECT_EQ( GLint( 3 ), ppca.VertexArray::named[ ClientState::NORMAL ].size ); EXPECT_EQ( GLint( 4 ), ppca.VertexArray::named[ ClientState::COLOR ].size ); EXPECT_EQ( GLint( 2 ), ppca.VertexArray::named[ ClientState::TEX_COORD ].size ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::VERTEX ].type ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::NORMAL ].type ); EXPECT_EQ( GLenum( GL_UNSIGNED_BYTE ), ppca.VertexArray::named[ ClientState::COLOR ].type ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::TEX_COORD ].type ); EXPECT_EQ( GLint( 24 ), ppca.VertexArray::named[ ClientState::VERTEX ].stride ); EXPECT_EQ( GLint( 0 ), ppca.VertexArray::named[ ClientState::NORMAL ].stride ); EXPECT_EQ( GLint( 24 ), ppca.VertexArray::named[ ClientState::COLOR ].stride ); EXPECT_EQ( GLint( 24 ), ppca.VertexArray::named[ ClientState::TEX_COORD ].stride ); EXPECT_EQ( reinterpret_cast( 12 ), ppca.VertexArray::named[ ClientState::VERTEX ].pointer ); EXPECT_EQ( reinterpret_cast( 0 ), ppca.VertexArray::named[ ClientState::NORMAL ].pointer ); EXPECT_EQ( reinterpret_cast( 8 ), ppca.VertexArray::named[ ClientState::COLOR ].pointer ); EXPECT_EQ( reinterpret_cast( 0 ), ppca.VertexArray::named[ ClientState::TEX_COORD ].pointer ); ppca.Reset(ctx); checkPpcaDefaults(ctx, ppca); ppca.glInterleavedArrays( GL_T2F_C3F_V3F, 0, NULL ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.VertexArray::named[ ClientState::VERTEX ].enabled ); EXPECT_EQ( GLboolean( GL_FALSE ), ppca.VertexArray::named[ ClientState::NORMAL ].enabled ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.VertexArray::named[ ClientState::COLOR ].enabled ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.VertexArray::named[ ClientState::TEX_COORD ].enabled ); EXPECT_EQ( GLint( 3 ), ppca.VertexArray::named[ ClientState::VERTEX ].size ); EXPECT_EQ( GLint( 3 ), ppca.VertexArray::named[ ClientState::NORMAL ].size ); EXPECT_EQ( GLint( 3 ), ppca.VertexArray::named[ ClientState::COLOR ].size ); EXPECT_EQ( GLint( 2 ), ppca.VertexArray::named[ ClientState::TEX_COORD ].size ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::VERTEX ].type ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::NORMAL ].type ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::COLOR ].type ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::TEX_COORD ].type ); EXPECT_EQ( GLint( 32 ), ppca.VertexArray::named[ ClientState::VERTEX ].stride ); EXPECT_EQ( GLint( 0 ), ppca.VertexArray::named[ ClientState::NORMAL ].stride ); EXPECT_EQ( GLint( 32 ), ppca.VertexArray::named[ ClientState::COLOR ].stride ); EXPECT_EQ( GLint( 32 ), ppca.VertexArray::named[ ClientState::TEX_COORD ].stride ); EXPECT_EQ( reinterpret_cast( 20 ), ppca.VertexArray::named[ ClientState::VERTEX ].pointer ); EXPECT_EQ( reinterpret_cast( 0 ), ppca.VertexArray::named[ ClientState::NORMAL ].pointer ); EXPECT_EQ( reinterpret_cast( 8 ), ppca.VertexArray::named[ ClientState::COLOR ].pointer ); EXPECT_EQ( reinterpret_cast( 0 ), ppca.VertexArray::named[ ClientState::TEX_COORD ].pointer ); ppca.Reset(ctx); checkPpcaDefaults(ctx, ppca); ppca.glInterleavedArrays( GL_T2F_N3F_V3F, 0, NULL ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.VertexArray::named[ ClientState::VERTEX ].enabled ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.VertexArray::named[ ClientState::NORMAL ].enabled ); EXPECT_EQ( GLboolean( GL_FALSE ), ppca.VertexArray::named[ ClientState::COLOR ].enabled ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.VertexArray::named[ ClientState::TEX_COORD ].enabled ); EXPECT_EQ( GLint( 3 ), ppca.VertexArray::named[ ClientState::VERTEX ].size ); EXPECT_EQ( GLint( 3 ), ppca.VertexArray::named[ ClientState::NORMAL ].size ); EXPECT_EQ( GLint( 4 ), ppca.VertexArray::named[ ClientState::COLOR ].size ); EXPECT_EQ( GLint( 2 ), ppca.VertexArray::named[ ClientState::TEX_COORD ].size ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::VERTEX ].type ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::NORMAL ].type ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::COLOR ].type ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::TEX_COORD ].type ); EXPECT_EQ( GLint( 32 ), ppca.VertexArray::named[ ClientState::VERTEX ].stride ); EXPECT_EQ( GLint( 32 ), ppca.VertexArray::named[ ClientState::NORMAL ].stride ); EXPECT_EQ( GLint( 0 ), ppca.VertexArray::named[ ClientState::COLOR ].stride ); EXPECT_EQ( GLint( 32 ), ppca.VertexArray::named[ ClientState::TEX_COORD ].stride ); EXPECT_EQ( reinterpret_cast( 20 ), ppca.VertexArray::named[ ClientState::VERTEX ].pointer ); EXPECT_EQ( reinterpret_cast( 8 ), ppca.VertexArray::named[ ClientState::NORMAL ].pointer ); EXPECT_EQ( reinterpret_cast( 0 ), ppca.VertexArray::named[ ClientState::COLOR ].pointer ); EXPECT_EQ( reinterpret_cast( 0 ), ppca.VertexArray::named[ ClientState::TEX_COORD ].pointer ); ppca.Reset(ctx); checkPpcaDefaults(ctx, ppca); ppca.glInterleavedArrays( GL_T2F_C4F_N3F_V3F, 0, NULL ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.VertexArray::named[ ClientState::VERTEX ].enabled ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.VertexArray::named[ ClientState::NORMAL ].enabled ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.VertexArray::named[ ClientState::COLOR ].enabled ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.VertexArray::named[ ClientState::TEX_COORD ].enabled ); EXPECT_EQ( GLint( 3 ), ppca.VertexArray::named[ ClientState::VERTEX ].size ); EXPECT_EQ( GLint( 3 ), ppca.VertexArray::named[ ClientState::NORMAL ].size ); EXPECT_EQ( GLint( 4 ), ppca.VertexArray::named[ ClientState::COLOR ].size ); EXPECT_EQ( GLint( 2 ), ppca.VertexArray::named[ ClientState::TEX_COORD ].size ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::VERTEX ].type ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::NORMAL ].type ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::COLOR ].type ); EXPECT_EQ( GLenum( GL_FLOAT ), ppca.VertexArray::named[ ClientState::TEX_COORD ].type ); EXPECT_EQ( GLint( 48 ), ppca.VertexArray::named[ ClientState::VERTEX ].stride ); EXPECT_EQ( GLint( 48 ), ppca.VertexArray::named[ ClientState::NORMAL ].stride ); EXPECT_EQ( GLint( 48 ), ppca.VertexArray::named[ ClientState::COLOR ].stride ); EXPECT_EQ( GLint( 48 ), ppca.VertexArray::named[ ClientState::TEX_COORD ].stride ); EXPECT_EQ( reinterpret_cast( 36 ), ppca.VertexArray::named[ ClientState::VERTEX ].pointer ); EXPECT_EQ( reinterpret_cast( 24 ), ppca.VertexArray::named[ ClientState::NORMAL ].pointer ); EXPECT_EQ( reinterpret_cast( 8 ), ppca.VertexArray::named[ ClientState::COLOR ].pointer ); EXPECT_EQ( reinterpret_cast( 0 ), ppca.VertexArray::named[ ClientState::TEX_COORD ].pointer ); // Pass in an unsupported "format", which should do nothing. ppca.Reset(ctx); checkPpcaDefaults(ctx, ppca); for (GLuint ii=0; ii( 987 ); } ppca.glInterleavedArrays( GL_RGBA, 0, NULL ); for (GLuint ii=0; ii( 987 ), ppca.VertexArray::named[ ii ].pointer ); } } TEST ( RegalPpca, glGet_Shadowing ) { RegalContext ctx; ctx.info = new ContextInfo(); Ppca ppca; checkPpcaDefaults(ctx, ppca); GLint resulti[ 1 ] = { 123 }; GLint64 resulti64[ 1 ] = { 123 }; GLfloat resultf[ 1 ] = { 123.f }; GLdouble resultd[ 1 ] = { 123. }; GLboolean resultb[ 1 ] = { GL_FALSE }; // First ensure getting an unimplemented value works (does nothing). EXPECT_EQ( GLboolean( GL_FALSE ), ppca.glGetv( &ctx, GL_FLOAT, resulti ) ); EXPECT_EQ( 123, resulti[ 0 ] ); EXPECT_EQ( GLboolean( GL_FALSE ), ppca.glGetv( &ctx, GL_FLOAT, resulti64 ) ); EXPECT_EQ( 123, resulti64[ 0 ] ); EXPECT_EQ( GLboolean( GL_FALSE ), ppca.glGetv( &ctx, GL_FLOAT, resultf ) ); EXPECT_EQ( 123, resultf[ 0 ] ); EXPECT_EQ( GLboolean( GL_FALSE ), ppca.glGetv( &ctx, GL_FLOAT, resultd ) ); EXPECT_EQ( 123, resultd[ 0 ] ); EXPECT_EQ( GLboolean( GL_FALSE ), ppca.glGetv( &ctx, GL_FLOAT, resultb ) ); EXPECT_EQ( GLboolean(GL_FALSE), resultb[ 0 ] ); // Next verify that getting an implemented value gets the value. EXPECT_EQ( GLboolean( GL_TRUE ), ppca.glGetv( &ctx, GL_MAX_CLIENT_ATTRIB_STACK_DEPTH, resulti ) ); EXPECT_EQ( REGAL_EMU_MAX_CLIENT_ATTRIB_STACK_DEPTH, resulti[ 0 ] ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.glGetv( &ctx, GL_MAX_CLIENT_ATTRIB_STACK_DEPTH, resulti64 ) ); EXPECT_EQ( REGAL_EMU_MAX_CLIENT_ATTRIB_STACK_DEPTH, resulti64[ 0 ] ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.glGetv( &ctx, GL_MAX_CLIENT_ATTRIB_STACK_DEPTH, resultf ) ); EXPECT_EQ( REGAL_EMU_MAX_CLIENT_ATTRIB_STACK_DEPTH, resultf[ 0 ] ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.glGetv( &ctx, GL_MAX_CLIENT_ATTRIB_STACK_DEPTH, resultd ) ); EXPECT_EQ( REGAL_EMU_MAX_CLIENT_ATTRIB_STACK_DEPTH, resultd[ 0 ] ); EXPECT_EQ( GLboolean( GL_TRUE ), ppca.glGetv( &ctx, GL_MAX_CLIENT_ATTRIB_STACK_DEPTH, resultb ) ); EXPECT_EQ( GLboolean(GL_TRUE), resultb[ 0 ] ); } TEST ( RegalPpca, glPixelStore_Shadowing ) { RegalContext ctx; ctx.info = new ContextInfo(); Ppca ppca; checkPpcaDefaults(ctx, ppca); // first test glPixelStorei ppca.glPixelStore( GL_UNPACK_SWAP_BYTES, GLint(GL_TRUE) ); ppca.glPixelStore( GL_UNPACK_LSB_FIRST, GLint(GL_TRUE) ); ppca.glPixelStore( GL_UNPACK_IMAGE_HEIGHT, GLint(11) ); ppca.glPixelStore( GL_UNPACK_SKIP_IMAGES, GLint(12) ); ppca.glPixelStore( GL_UNPACK_ROW_LENGTH, GLint(13) ); ppca.glPixelStore( GL_UNPACK_SKIP_ROWS, GLint(14) ); ppca.glPixelStore( GL_UNPACK_SKIP_PIXELS, GLint(15) ); ppca.glPixelStore( GL_UNPACK_ALIGNMENT, GLint(16) ); ppca.glPixelStore( GL_PACK_SWAP_BYTES, GLint(GL_TRUE) ); ppca.glPixelStore( GL_PACK_LSB_FIRST, GLint(GL_TRUE) ); ppca.glPixelStore( GL_PACK_IMAGE_HEIGHT, GLint(27) ); ppca.glPixelStore( GL_PACK_SKIP_IMAGES, GLint(28) ); ppca.glPixelStore( GL_PACK_ROW_LENGTH, GLint(29) ); ppca.glPixelStore( GL_PACK_SKIP_ROWS, GLint(30) ); ppca.glPixelStore( GL_PACK_SKIP_PIXELS, GLint(31) ); ppca.glPixelStore( GL_PACK_ALIGNMENT, GLint(32) ); ppca.glBindBuffer( GL_PIXEL_UNPACK_BUFFER, GLuint(123) ); ppca.glBindBuffer( GL_PIXEL_PACK_BUFFER, GLuint(456) ); EXPECT_EQ( GLint(GL_TRUE), ppca.PixelStore::unpackSwapBytes ); EXPECT_EQ( GLint(GL_TRUE), ppca.PixelStore::unpackLsbFirst ); EXPECT_EQ( GLint(11), ppca.PixelStore::unpackImageHeight ); EXPECT_EQ( GLint(12), ppca.PixelStore::unpackSkipImages ); EXPECT_EQ( GLint(13), ppca.PixelStore::unpackRowLength ); EXPECT_EQ( GLint(14), ppca.PixelStore::unpackSkipRows ); EXPECT_EQ( GLint(15), ppca.PixelStore::unpackSkipPixels ); EXPECT_EQ( GLint(16), ppca.PixelStore::unpackAlignment ); EXPECT_EQ( GLint(GL_TRUE), ppca.PixelStore::packSwapBytes ); EXPECT_EQ( GLint(GL_TRUE), ppca.PixelStore::packLsbFirst ); EXPECT_EQ( GLint(27), ppca.PixelStore::packImageHeight ); EXPECT_EQ( GLint(28), ppca.PixelStore::packSkipImages ); EXPECT_EQ( GLint(29), ppca.PixelStore::packRowLength ); EXPECT_EQ( GLint(30), ppca.PixelStore::packSkipRows ); EXPECT_EQ( GLint(31), ppca.PixelStore::packSkipPixels ); EXPECT_EQ( GLint(32), ppca.PixelStore::packAlignment ); EXPECT_EQ( GLuint(123), ppca.PixelStore::pixelUnpackBufferBinding ); EXPECT_EQ( GLuint(456), ppca.PixelStore::pixelPackBufferBinding ); // reset just the pixel store state then verify that // the entire ppca is now back to default state ppca.PixelStore::Reset(); checkPpcaDefaults(ctx, ppca); // now test glPixelStoref ppca.glPixelStore( GL_UNPACK_SWAP_BYTES, GLfloat(1.11) ); ppca.glPixelStore( GL_UNPACK_LSB_FIRST, GLfloat(0) ); ppca.glPixelStore( GL_UNPACK_IMAGE_HEIGHT, GLfloat(11.0) ); ppca.glPixelStore( GL_UNPACK_SKIP_IMAGES, GLfloat(12.1) ); ppca.glPixelStore( GL_UNPACK_ROW_LENGTH, GLfloat(13.2) ); ppca.glPixelStore( GL_UNPACK_SKIP_ROWS, GLfloat(14.3) ); ppca.glPixelStore( GL_UNPACK_SKIP_PIXELS, GLfloat(15.4) ); ppca.glPixelStore( GL_UNPACK_ALIGNMENT, GLfloat(16.5) ); ppca.glPixelStore( GL_PACK_SWAP_BYTES, GLfloat(GL_TRUE) ); ppca.glPixelStore( GL_PACK_LSB_FIRST, GLfloat(GL_TRUE) ); ppca.glPixelStore( GL_PACK_IMAGE_HEIGHT, GLfloat(27.01) ); ppca.glPixelStore( GL_PACK_SKIP_IMAGES, GLfloat(28.02) ); ppca.glPixelStore( GL_PACK_ROW_LENGTH, GLfloat(29.03) ); ppca.glPixelStore( GL_PACK_SKIP_ROWS, GLfloat(30.04) ); ppca.glPixelStore( GL_PACK_SKIP_PIXELS, GLfloat(31.05) ); ppca.glPixelStore( GL_PACK_ALIGNMENT, GLfloat(32.06) ); ppca.glBindBuffer( GL_PIXEL_UNPACK_BUFFER, GLuint(123) ); ppca.glBindBuffer( GL_PIXEL_PACK_BUFFER, GLuint(456) ); EXPECT_EQ( GLfloat(GL_TRUE), ppca.PixelStore::unpackSwapBytes ); EXPECT_EQ( GLfloat(GL_FALSE), ppca.PixelStore::unpackLsbFirst ); EXPECT_EQ( GLfloat(11), ppca.PixelStore::unpackImageHeight ); EXPECT_EQ( GLfloat(12), ppca.PixelStore::unpackSkipImages ); EXPECT_EQ( GLfloat(13), ppca.PixelStore::unpackRowLength ); EXPECT_EQ( GLfloat(14), ppca.PixelStore::unpackSkipRows ); EXPECT_EQ( GLfloat(15), ppca.PixelStore::unpackSkipPixels ); EXPECT_EQ( GLfloat(16), ppca.PixelStore::unpackAlignment ); EXPECT_EQ( GLfloat(GL_TRUE), ppca.PixelStore::packSwapBytes ); EXPECT_EQ( GLfloat(GL_TRUE), ppca.PixelStore::packLsbFirst ); EXPECT_EQ( GLfloat(27), ppca.PixelStore::packImageHeight ); EXPECT_EQ( GLfloat(28), ppca.PixelStore::packSkipImages ); EXPECT_EQ( GLfloat(29), ppca.PixelStore::packRowLength ); EXPECT_EQ( GLfloat(30), ppca.PixelStore::packSkipRows ); EXPECT_EQ( GLfloat(31), ppca.PixelStore::packSkipPixels ); EXPECT_EQ( GLfloat(32), ppca.PixelStore::packAlignment ); EXPECT_EQ( GLuint(123), ppca.PixelStore::pixelUnpackBufferBinding ); EXPECT_EQ( GLuint(456), ppca.PixelStore::pixelPackBufferBinding ); } TEST ( RegalPpca, glBindBuffer_Shadowing ) { RegalContext ctx; ctx.info = new ContextInfo(); Ppca ppca; checkPpcaDefaults(ctx, ppca); ppca.VertexArray::arrayBufferBinding = 0; ppca.VertexArray::elementArrayBufferBinding = 0; ppca.PixelStore::pixelUnpackBufferBinding = 0; ppca.PixelStore::pixelPackBufferBinding = 0; ppca.glBindBuffer( GL_ARRAY_BUFFER, GLuint(12) ); EXPECT_EQ( GLuint(12), ppca.VertexArray::arrayBufferBinding ); EXPECT_EQ( GLuint( 0), ppca.VertexArray::elementArrayBufferBinding ); EXPECT_EQ( GLuint( 0), ppca.PixelStore::pixelUnpackBufferBinding ); EXPECT_EQ( GLuint( 0), ppca.PixelStore::pixelPackBufferBinding ); ppca.glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, GLuint(34) ); EXPECT_EQ( GLuint(12), ppca.VertexArray::arrayBufferBinding ); EXPECT_EQ( GLuint(34), ppca.VertexArray::elementArrayBufferBinding ); EXPECT_EQ( GLuint( 0), ppca.PixelStore::pixelUnpackBufferBinding ); EXPECT_EQ( GLuint( 0), ppca.PixelStore::pixelPackBufferBinding ); ppca.glBindBuffer( GL_PIXEL_UNPACK_BUFFER, GLuint(21) ); EXPECT_EQ( GLuint(12), ppca.VertexArray::arrayBufferBinding ); EXPECT_EQ( GLuint(34), ppca.VertexArray::elementArrayBufferBinding ); EXPECT_EQ( GLuint(21), ppca.PixelStore::pixelUnpackBufferBinding ); EXPECT_EQ( GLuint( 0), ppca.PixelStore::pixelPackBufferBinding ); ppca.glBindBuffer( GL_PIXEL_PACK_BUFFER, GLuint(43) ); EXPECT_EQ( GLuint(12), ppca.VertexArray::arrayBufferBinding ); EXPECT_EQ( GLuint(34), ppca.VertexArray::elementArrayBufferBinding ); EXPECT_EQ( GLuint(21), ppca.PixelStore::pixelUnpackBufferBinding ); EXPECT_EQ( GLuint(43), ppca.PixelStore::pixelPackBufferBinding ); GLuint validBuffers[] = { GL_ATOMIC_COUNTER_BUFFER, GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, GL_DRAW_INDIRECT_BUFFER, GL_DISPATCH_INDIRECT_BUFFER, GL_SHADER_STORAGE_BUFFER, GL_TEXTURE_BUFFER, GL_TRANSFORM_FEEDBACK_BUFFER, GL_UNIFORM_BUFFER }; GLuint nValidBuffers = sizeof(validBuffers)/sizeof(GLuint); for (GLuint n=0; n= 3 && ii < 6) { EXPECT_EQ( GLuint(0), ppca.VertexArray::bindings[ii].buffer ); EXPECT_EQ( GLintptr(0), ppca.VertexArray::bindings[ii].offset ); EXPECT_EQ( GLsizei(16), ppca.VertexArray::bindings[ii].stride ); } else { EXPECT_EQ( GLuint(333), ppca.VertexArray::bindings[ii].buffer ); EXPECT_EQ( GLintptr(0xdead), ppca.VertexArray::bindings[ii].offset ); EXPECT_EQ( GLsizei(11), ppca.VertexArray::bindings[ii].stride ); } ppca.VertexArray::bindings[ii].buffer = GLuint(0); ppca.VertexArray::bindings[ii].offset = GLintptr(0); ppca.VertexArray::bindings[ii].stride = GLsizei(16); } checkPpcaDefaults(ctx, ppca); // a second partial test glBindVertexBuffers with a vertex array bound ppca.Reset(ctx); checkPpcaDefaults(ctx, ppca); for (GLuint ii=0; ii(testOffset) ); EXPECT_EQ( testSize, ppca.VertexArray::generic[ii].size ); EXPECT_EQ( testType, ppca.VertexArray::generic[ii].type ); EXPECT_EQ( GLuint( 0 ), ppca.VertexArray::generic[ii].relativeOffset ); EXPECT_EQ( GLboolean(GL_FALSE), ppca.VertexArray::generic[ii].normalized ); EXPECT_EQ( GLboolean(GL_TRUE), ppca.VertexArray::generic[ii].isInteger ); EXPECT_EQ( GLboolean(GL_FALSE), ppca.VertexArray::generic[ii].isLong ); EXPECT_EQ( ii, ppca.VertexArray::generic[ii].bindingIndex ); EXPECT_EQ( testBuffer, ppca.VertexArray::bindings[ii].buffer ); EXPECT_EQ( testOffset, ppca.VertexArray::bindings[ii].offset ); EXPECT_EQ( testStride, ppca.VertexArray::bindings[ii].stride ); ppca.VertexArray::generic[ii].size = 4; ppca.VertexArray::generic[ii].type = GL_FLOAT; ppca.VertexArray::generic[ii].relativeOffset = GLuint(0); ppca.VertexArray::generic[ii].normalized = GL_FALSE; ppca.VertexArray::generic[ii].isInteger = GL_FALSE; ppca.VertexArray::generic[ii].isLong = GL_FALSE; ppca.VertexArray::generic[ii].bindingIndex = ii; ppca.VertexArray::bindings[ii].buffer = GLuint(0); ppca.VertexArray::bindings[ii].offset = GLintptr(0); ppca.VertexArray::bindings[ii].stride = GLsizei(16); checkPpcaDefaults(ctx, ppca); ppca.VertexArray::generic[ii].relativeOffset = GLuint(1); ppca.VertexArray::vertexArrayBinding = 0; ppca.glVertexAttribLPointer( ii, testSize, testType, testStride, reinterpret_cast(testOffset) ); EXPECT_EQ( testSize, ppca.VertexArray::generic[ii].size ); EXPECT_EQ( testType, ppca.VertexArray::generic[ii].type ); EXPECT_EQ( GLuint( 0 ), ppca.VertexArray::generic[ii].relativeOffset ); EXPECT_EQ( GLboolean(GL_FALSE), ppca.VertexArray::generic[ii].normalized ); EXPECT_EQ( GLboolean(GL_FALSE), ppca.VertexArray::generic[ii].isInteger ); EXPECT_EQ( GLboolean(GL_TRUE), ppca.VertexArray::generic[ii].isLong ); EXPECT_EQ( ii, ppca.VertexArray::generic[ii].bindingIndex ); EXPECT_EQ( testBuffer, ppca.VertexArray::bindings[ii].buffer ); EXPECT_EQ( testOffset, ppca.VertexArray::bindings[ii].offset ); EXPECT_EQ( testStride, ppca.VertexArray::bindings[ii].stride ); ppca.VertexArray::generic[ii].size = 4; ppca.VertexArray::generic[ii].type = GL_FLOAT; ppca.VertexArray::generic[ii].relativeOffset = GLuint(0); ppca.VertexArray::generic[ii].normalized = GL_FALSE; ppca.VertexArray::generic[ii].isInteger = GL_FALSE; ppca.VertexArray::generic[ii].isLong = GL_FALSE; ppca.VertexArray::generic[ii].bindingIndex = ii; ppca.VertexArray::bindings[ii].buffer = GLuint(0); ppca.VertexArray::bindings[ii].offset = GLintptr(0); ppca.VertexArray::bindings[ii].stride = GLsizei(16); checkPpcaDefaults(ctx, ppca); ppca.VertexArray::generic[ii].relativeOffset = GLuint(1); ppca.VertexArray::generic[ii].normalized = GL_TRUE; ppca.VertexArray::vertexArrayBinding = 0; ppca.glVertexAttribPointer( ii, testSize, testType, GL_FALSE, testStride, reinterpret_cast(testOffset) ); EXPECT_EQ( testSize, ppca.VertexArray::generic[ii].size ); EXPECT_EQ( testType, ppca.VertexArray::generic[ii].type ); EXPECT_EQ( GLuint( 0 ), ppca.VertexArray::generic[ii].relativeOffset ); EXPECT_EQ( GLboolean(GL_FALSE), ppca.VertexArray::generic[ii].normalized ); EXPECT_EQ( GLboolean(GL_FALSE), ppca.VertexArray::generic[ii].isInteger ); EXPECT_EQ( GLboolean(GL_FALSE), ppca.VertexArray::generic[ii].isLong ); EXPECT_EQ( ii, ppca.VertexArray::generic[ii].bindingIndex ); EXPECT_EQ( testBuffer, ppca.VertexArray::bindings[ii].buffer ); EXPECT_EQ( testOffset, ppca.VertexArray::bindings[ii].offset ); EXPECT_EQ( testStride, ppca.VertexArray::bindings[ii].stride ); ppca.VertexArray::generic[ii].size = 4; ppca.VertexArray::generic[ii].type = GL_FLOAT; ppca.VertexArray::generic[ii].relativeOffset = GLuint(0); ppca.VertexArray::generic[ii].normalized = GL_FALSE; ppca.VertexArray::generic[ii].isInteger = GL_FALSE; ppca.VertexArray::generic[ii].isLong = GL_FALSE; ppca.VertexArray::generic[ii].bindingIndex = ii; ppca.VertexArray::bindings[ii].buffer = GLuint(0); ppca.VertexArray::bindings[ii].offset = GLintptr(0); ppca.VertexArray::bindings[ii].stride = GLsizei(16); checkPpcaDefaults(ctx, ppca); ppca.VertexArray::generic[ii].relativeOffset = GLuint(1); ppca.VertexArray::generic[ii].normalized = GL_FALSE; ppca.VertexArray::vertexArrayBinding = 0; ppca.glVertexAttribPointer( ii, testSize, testType, GL_TRUE, testStride, reinterpret_cast(testOffset) ); EXPECT_EQ( testSize, ppca.VertexArray::generic[ii].size ); EXPECT_EQ( testType, ppca.VertexArray::generic[ii].type ); EXPECT_EQ( GLuint( 0 ), ppca.VertexArray::generic[ii].relativeOffset ); EXPECT_EQ( GLboolean(GL_TRUE), ppca.VertexArray::generic[ii].normalized ); EXPECT_EQ( GLboolean(GL_FALSE), ppca.VertexArray::generic[ii].isInteger ); EXPECT_EQ( GLboolean(GL_FALSE), ppca.VertexArray::generic[ii].isLong ); EXPECT_EQ( ii, ppca.VertexArray::generic[ii].bindingIndex ); EXPECT_EQ( testBuffer, ppca.VertexArray::bindings[ii].buffer ); EXPECT_EQ( testOffset, ppca.VertexArray::bindings[ii].offset ); EXPECT_EQ( testStride, ppca.VertexArray::bindings[ii].stride ); ppca.VertexArray::generic[ii].size = 4; ppca.VertexArray::generic[ii].type = GL_FLOAT; ppca.VertexArray::generic[ii].relativeOffset = GLuint(0); ppca.VertexArray::generic[ii].normalized = GL_FALSE; ppca.VertexArray::generic[ii].isInteger = GL_FALSE; ppca.VertexArray::generic[ii].isLong = GL_FALSE; ppca.VertexArray::generic[ii].bindingIndex = ii; ppca.VertexArray::bindings[ii].buffer = GLuint(0); ppca.VertexArray::bindings[ii].offset = GLintptr(0); ppca.VertexArray::bindings[ii].stride = GLsizei(16); checkPpcaDefaults(ctx, ppca); } // test glVertexAttrib(I|L|)Pointer with a vertex array bound for (GLuint ii=0; ii(testOffset) ); EXPECT_EQ( GLuint( 1 ), ppca.VertexArray::generic[ii].relativeOffset ); EXPECT_EQ( GLuint( 1 ), ppca.VertexArray::vertexArrayBinding ); EXPECT_EQ( GLboolean(GL_TRUE), ppca.VertexArray::generic[ii].normalized ); EXPECT_EQ( GLboolean(GL_FALSE), ppca.VertexArray::generic[ii].isInteger ); EXPECT_EQ( GLboolean(GL_TRUE), ppca.VertexArray::generic[ii].isLong ); ppca.VertexArray::generic[ii].normalized = GL_FALSE; ppca.VertexArray::generic[ii].isInteger = GL_FALSE; ppca.VertexArray::generic[ii].isLong = GL_FALSE; ppca.VertexArray::generic[ii].relativeOffset = GLuint(0); ppca.VertexArray::vertexArrayBinding = 0; checkPpcaDefaults(ctx, ppca); ppca.VertexArray::generic[ii].normalized = GL_TRUE; ppca.VertexArray::generic[ii].isInteger = GL_TRUE; ppca.VertexArray::generic[ii].isLong = GL_FALSE; ppca.VertexArray::generic[ii].relativeOffset = GLuint(1); ppca.VertexArray::vertexArrayBinding = 1; ppca.glVertexAttribLPointer( ii, testSize, testType, testStride, reinterpret_cast(testOffset) ); EXPECT_EQ( GLuint( 1 ), ppca.VertexArray::generic[ii].relativeOffset ); EXPECT_EQ( GLuint( 1 ), ppca.VertexArray::vertexArrayBinding ); EXPECT_EQ( GLboolean(GL_TRUE), ppca.VertexArray::generic[ii].normalized ); EXPECT_EQ( GLboolean(GL_TRUE), ppca.VertexArray::generic[ii].isInteger ); EXPECT_EQ( GLboolean(GL_FALSE), ppca.VertexArray::generic[ii].isLong ); ppca.VertexArray::generic[ii].normalized = GL_FALSE; ppca.VertexArray::generic[ii].isInteger = GL_FALSE; ppca.VertexArray::generic[ii].isLong = GL_FALSE; ppca.VertexArray::generic[ii].relativeOffset = GLuint(0); ppca.VertexArray::vertexArrayBinding = 0; checkPpcaDefaults(ctx, ppca); ppca.VertexArray::generic[ii].normalized = GL_TRUE; ppca.VertexArray::generic[ii].isInteger = GL_TRUE; ppca.VertexArray::generic[ii].isLong = GL_TRUE; ppca.VertexArray::generic[ii].relativeOffset = GLuint(1); ppca.VertexArray::vertexArrayBinding = 1; ppca.glVertexAttribPointer( ii, testSize, testType, GL_FALSE, testStride, reinterpret_cast(testOffset) ); EXPECT_EQ( GLuint( 1 ), ppca.VertexArray::generic[ii].relativeOffset ); EXPECT_EQ( GLuint( 1 ), ppca.VertexArray::vertexArrayBinding ); EXPECT_EQ( GLboolean(GL_TRUE), ppca.VertexArray::generic[ii].normalized ); EXPECT_EQ( GLboolean(GL_TRUE), ppca.VertexArray::generic[ii].isInteger ); EXPECT_EQ( GLboolean(GL_TRUE), ppca.VertexArray::generic[ii].isLong ); ppca.VertexArray::generic[ii].normalized = GL_FALSE; ppca.VertexArray::generic[ii].isInteger = GL_FALSE; ppca.VertexArray::generic[ii].isLong = GL_FALSE; ppca.VertexArray::generic[ii].relativeOffset = GLuint(0); ppca.VertexArray::vertexArrayBinding = 0; checkPpcaDefaults(ctx, ppca); ppca.VertexArray::generic[ii].normalized = GL_FALSE; ppca.VertexArray::generic[ii].isInteger = GL_TRUE; ppca.VertexArray::generic[ii].isLong = GL_TRUE; ppca.VertexArray::generic[ii].relativeOffset = GLuint(1); ppca.VertexArray::vertexArrayBinding = 1; ppca.glVertexAttribPointer( ii, testSize, testType, GL_TRUE, testStride, reinterpret_cast(testOffset) ); EXPECT_EQ( GLuint( 1 ), ppca.VertexArray::generic[ii].relativeOffset ); EXPECT_EQ( GLuint( 1 ), ppca.VertexArray::vertexArrayBinding ); EXPECT_EQ( GLboolean(GL_FALSE), ppca.VertexArray::generic[ii].normalized ); EXPECT_EQ( GLboolean(GL_TRUE), ppca.VertexArray::generic[ii].isInteger ); EXPECT_EQ( GLboolean(GL_TRUE), ppca.VertexArray::generic[ii].isLong ); ppca.VertexArray::generic[ii].normalized = GL_FALSE; ppca.VertexArray::generic[ii].isInteger = GL_FALSE; ppca.VertexArray::generic[ii].isLong = GL_FALSE; ppca.VertexArray::generic[ii].relativeOffset = GLuint(0); ppca.VertexArray::vertexArrayBinding = 0; checkPpcaDefaults(ctx, ppca); } } TEST ( RegalPpca, glVertexArrayVertexAttribOffsetEXT_Shadowing ) { RegalContext ctx; ctx.info = new ContextInfo(); Ppca ppca; checkPpcaDefaults(ctx, ppca); // test glVertexArrayVertexAttrib(I|)OffsetEXT with no vertex array bound for (GLuint ii=0; ii