gles2_implementation_unittest.cc revision 6e8cce623b6e4fe0c9e4af605d675dd9d0338c38
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests for GLES2Implementation. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/client/gles2_implementation.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include <limits> 10e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <GLES2/gl2ext.h> 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <GLES2/gl2extchromium.h> 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/compiler_specific.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/client/client_test_helper.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/client/program_info_manager.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/client/transfer_buffer.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/common/command_buffer.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GLES2_SUPPORT_CLIENT_SIDE_ARRAYS 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_; 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::AtLeast; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::AnyNumber; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::DoAll; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::InSequence; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Invoke; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Mock; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Sequence; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::StrictMock; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Truly; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Return; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P2(SetMemory, dst, obj) { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(dst, &obj, sizeof(obj)); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P3(SetMemoryFromArray, dst, array, size) { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(dst, array, size); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used to help set the transfer buffer result to SizedResult of a single value. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename T> 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SizedResultHelper { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit SizedResultHelper(T result) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : size_(sizeof(result)), 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_(result) { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 size_; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) T result_; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Struct to make it easy to pass a vec4 worth of floats. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct FourFloats { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FourFloats(float _x, float _y, float _z, float _w) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : x(_x), 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) y(_y), 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) z(_z), 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w(_w) { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float x; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float y; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float z; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float w; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma pack(push, 1) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Struct that holds 7 characters. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Str7 { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char str[7]; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma pack(pop) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockTransferBuffer : public TransferBufferInterface { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct ExpectedMemoryInfo { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 offset; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 id; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8* ptr; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockTransferBuffer( 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandBuffer* command_buffer, 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int size, 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int result_size, 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int alignment) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : command_buffer_(command_buffer), 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_(size), 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_size_(result_size), 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) alignment_(alignment), 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actual_buffer_index_(0), 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_buffer_index_(0), 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_alloc_(NULL), 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_offset_(result_size), 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actual_offset_(result_size) { 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We have to allocate the buffers here because 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we need to know their address before GLES2Implementation::Initialize 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is called. 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int ii = 0; ii < kNumBuffers; ++ii) { 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) buffers_[ii] = command_buffer_->CreateTransferBuffer( 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_ + ii * alignment_, 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &buffer_ids_[ii]); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(-1, buffer_ids_[ii]); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MockTransferBuffer() { } 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool Initialize( 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int starting_buffer_size, 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int result_size, 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int /* min_buffer_size */, 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int /* max_buffer_size */, 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int alignment, 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int size_to_flush) OVERRIDE; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int GetShmId() OVERRIDE; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void* GetResultBuffer() OVERRIDE; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int GetResultOffset() OVERRIDE; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Free() OVERRIDE; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool HaveBuffer() const OVERRIDE; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void* AllocUpTo( 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int size, unsigned int* size_allocated) OVERRIDE; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void* Alloc(unsigned int size) OVERRIDE; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual RingBuffer::Offset GetOffset(void* pointer) const OVERRIDE; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void FreePendingToken(void* p, unsigned int /* token */) OVERRIDE; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t MaxTransferBufferSize() { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return size_ - result_size_; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int RoundToAlignment(unsigned int size) { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (size + alignment_ - 1) & ~(alignment_ - 1); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool InSync() { 146a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return expected_buffer_index_ == actual_buffer_index_ && 147a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) expected_offset_ == actual_offset_; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo GetExpectedMemory(size_t size) { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mem.offset = AllocateExpectedTransferBuffer(size); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mem.id = GetExpectedTransferBufferId(); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mem.ptr = static_cast<uint8*>( 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetExpectedTransferAddressFromOffset(mem.offset, size)); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mem; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo GetExpectedResultMemory(size_t size) { 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mem.offset = GetExpectedResultBufferOffset(); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mem.id = GetExpectedResultBufferId(); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mem.ptr = static_cast<uint8*>( 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetExpectedTransferAddressFromOffset(mem.offset, size)); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mem; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kNumBuffers = 2; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8* actual_buffer() const { 172effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return static_cast<uint8*>(buffers_[actual_buffer_index_]->memory()); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8* expected_buffer() const { 176effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return static_cast<uint8*>(buffers_[expected_buffer_index_]->memory()); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 AllocateExpectedTransferBuffer(size_t size) { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_LE(size, MaxTransferBufferSize()); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Toggle which buffer we get each time to simulate the buffer being 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reallocated. 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_buffer_index_ = (expected_buffer_index_ + 1) % kNumBuffers; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (expected_offset_ + size > size_) { 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_offset_ = result_size_; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 offset = expected_offset_; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_offset_ += RoundToAlignment(size); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure each buffer has a different offset. 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return offset + expected_buffer_index_ * alignment_; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* GetExpectedTransferAddressFromOffset(uint32 offset, size_t size) { 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GE(offset, expected_buffer_index_ * alignment_); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_LE(offset + size, size_ + expected_buffer_index_ * alignment_); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return expected_buffer() + offset; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int GetExpectedResultBufferId() { 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return buffer_ids_[expected_buffer_index_]; 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 GetExpectedResultBufferOffset() { 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return expected_buffer_index_ * alignment_; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int GetExpectedTransferBufferId() { 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return buffer_ids_[expected_buffer_index_]; 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandBuffer* command_buffer_; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t size_; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t result_size_; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 alignment_; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int buffer_ids_[kNumBuffers]; 219effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_refptr<Buffer> buffers_[kNumBuffers]; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int actual_buffer_index_; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_buffer_index_; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* last_alloc_; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 expected_offset_; 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 actual_offset_; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MockTransferBuffer); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MockTransferBuffer::Initialize( 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int starting_buffer_size, 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int result_size, 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int /* min_buffer_size */, 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int /* max_buffer_size */, 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int alignment, 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int /* size_to_flush */) { 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Just check they match. 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return size_ == starting_buffer_size && 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_size_ == result_size && 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) alignment_ == alignment; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MockTransferBuffer::GetShmId() { 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return buffer_ids_[actual_buffer_index_]; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void* MockTransferBuffer::GetResultBuffer() { 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return actual_buffer() + actual_buffer_index_ * alignment_; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MockTransferBuffer::GetResultOffset() { 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return actual_buffer_index_ * alignment_; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockTransferBuffer::Free() { 255f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NOTREACHED(); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MockTransferBuffer::HaveBuffer() const { 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void* MockTransferBuffer::AllocUpTo( 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int size, unsigned int* size_allocated) { 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(size_allocated != NULL); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(last_alloc_ == NULL); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Toggle which buffer we get each time to simulate the buffer being 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reallocated. 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actual_buffer_index_ = (actual_buffer_index_ + 1) % kNumBuffers; 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size = std::min(static_cast<size_t>(size), MaxTransferBufferSize()); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (actual_offset_ + size > size_) { 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actual_offset_ = result_size_; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 offset = actual_offset_; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actual_offset_ += RoundToAlignment(size); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *size_allocated = size; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure each buffer has a different offset. 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_alloc_ = actual_buffer() + offset + actual_buffer_index_ * alignment_; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return last_alloc_; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void* MockTransferBuffer::Alloc(unsigned int size) { 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_LE(size, MaxTransferBufferSize()); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int temp = 0; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* p = AllocUpTo(size, &temp); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(temp, size); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return p; 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RingBuffer::Offset MockTransferBuffer::GetOffset(void* pointer) const { 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure each buffer has a different offset. 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<uint8*>(pointer) - actual_buffer(); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockTransferBuffer::FreePendingToken(void* p, unsigned int /* token */) { 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(last_alloc_, p); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_alloc_ = NULL; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 302a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// API wrapper for Buffers. 303a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class GenBuffersAPI { 304a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public: 305a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static void Gen(GLES2Implementation* gl_impl, GLsizei n, GLuint* ids) { 306a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gl_impl->GenBuffers(n, ids); 307a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 308a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 309a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static void Delete(GLES2Implementation* gl_impl, 310a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GLsizei n, 311a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const GLuint* ids) { 312a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gl_impl->DeleteBuffers(n, ids); 313a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 314a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 315a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 316a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// API wrapper for Framebuffers. 317a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class GenFramebuffersAPI { 318a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public: 319a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static void Gen(GLES2Implementation* gl_impl, GLsizei n, GLuint* ids) { 320a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gl_impl->GenFramebuffers(n, ids); 321a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 322a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 323a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static void Delete(GLES2Implementation* gl_impl, 324a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GLsizei n, 325a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const GLuint* ids) { 326a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gl_impl->DeleteFramebuffers(n, ids); 327a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 328a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 329a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 330a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// API wrapper for Renderbuffers. 331a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class GenRenderbuffersAPI { 332a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public: 333a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static void Gen(GLES2Implementation* gl_impl, GLsizei n, GLuint* ids) { 334a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gl_impl->GenRenderbuffers(n, ids); 335a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 336a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 337a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static void Delete(GLES2Implementation* gl_impl, 338a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GLsizei n, 339a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const GLuint* ids) { 340a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gl_impl->DeleteRenderbuffers(n, ids); 341a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 342a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 343a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 344a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// API wrapper for Textures. 345a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class GenTexturesAPI { 346a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public: 347a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static void Gen(GLES2Implementation* gl_impl, GLsizei n, GLuint* ids) { 348a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gl_impl->GenTextures(n, ids); 349a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 350a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 351a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static void Delete(GLES2Implementation* gl_impl, 352a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GLsizei n, 353a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const GLuint* ids) { 354a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gl_impl->DeleteTextures(n, ids); 355a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 356a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 357a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GLES2ImplementationTest : public testing::Test { 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 360a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static const int kNumTestContexts = 2; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const uint8 kInitialValue = 0xBD; 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int32 kNumCommandEntries = 500; 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int32 kCommandBufferSizeBytes = 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kNumCommandEntries * sizeof(CommandBufferEntry); 365a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) static const size_t kTransferBufferSize = 512; 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLint kMaxCombinedTextureImageUnits = 8; 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLint kMaxCubeMapTextureSize = 64; 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLint kMaxFragmentUniformVectors = 16; 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLint kMaxRenderbufferSize = 64; 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLint kMaxTextureImageUnits = 8; 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLint kMaxTextureSize = 128; 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLint kMaxVaryingVectors = 8; 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLint kMaxVertexAttribs = 8; 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLint kMaxVertexTextureImageUnits = 0; 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLint kMaxVertexUniformVectors = 128; 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLint kNumCompressedTextureFormats = 0; 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLint kNumShaderBinaryFormats = 0; 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLuint kStartId = 1024; 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLuint kBuffersStartId = 381a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GLES2Implementation::kClientSideArrayId + 2 * kNumTestContexts; 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLuint kFramebuffersStartId = 1; 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLuint kProgramsAndShadersStartId = 1; 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLuint kRenderbuffersStartId = 1; 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLuint kTexturesStartId = 1; 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLuint kQueriesStartId = 1; 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLuint kVertexArraysStartId = 1; 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef MockTransferBuffer::ExpectedMemoryInfo ExpectedMemoryInfo; 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 391a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) class TestContext { 392a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public: 393a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TestContext() : commands_(NULL), token_(0) {} 394a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 395c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool Initialize(ShareGroup* share_group, 3966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bool bind_generates_resource_client, 3976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bool bind_generates_resource_service, 398e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch bool lose_context_when_out_of_memory) { 399a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) command_buffer_.reset(new StrictMock<MockClientCommandBuffer>()); 400c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!command_buffer_->Initialize()) 401c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return false; 402a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 403a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) transfer_buffer_.reset( 404a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new MockTransferBuffer(command_buffer_.get(), 405a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kTransferBufferSize, 406a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GLES2Implementation::kStartingOffset, 407a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GLES2Implementation::kAlignment)); 408a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 409a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) helper_.reset(new GLES2CmdHelper(command_buffer())); 410a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) helper_->Initialize(kCommandBufferSizeBytes); 411a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 412a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gpu_control_.reset(new StrictMock<MockClientGpuControl>()); 413a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_CALL(*gpu_control_, GetCapabilities()) 414a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) .WillOnce(testing::Return(Capabilities())); 415a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 416a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GLES2Implementation::GLStaticState state; 417a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GLES2Implementation::GLStaticState::IntState& int_state = state.int_state; 418a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int_state.max_combined_texture_image_units = 419a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kMaxCombinedTextureImageUnits; 420a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int_state.max_cube_map_texture_size = kMaxCubeMapTextureSize; 421a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int_state.max_fragment_uniform_vectors = kMaxFragmentUniformVectors; 422a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int_state.max_renderbuffer_size = kMaxRenderbufferSize; 423a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int_state.max_texture_image_units = kMaxTextureImageUnits; 424a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int_state.max_texture_size = kMaxTextureSize; 425a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int_state.max_varying_vectors = kMaxVaryingVectors; 426a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int_state.max_vertex_attribs = kMaxVertexAttribs; 427a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int_state.max_vertex_texture_image_units = kMaxVertexTextureImageUnits; 428a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int_state.max_vertex_uniform_vectors = kMaxVertexUniformVectors; 429a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int_state.num_compressed_texture_formats = kNumCompressedTextureFormats; 430a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int_state.num_shader_binary_formats = kNumShaderBinaryFormats; 431c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int_state.bind_generates_resource_chromium = 4326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bind_generates_resource_service ? 1 : 0; 433a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 434a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This just happens to work for now because IntState has 1 GLint per 435a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // state. 436a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // If IntState gets more complicated this code will need to get more 437a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // complicated. 438a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ExpectedMemoryInfo mem1 = transfer_buffer_->GetExpectedMemory( 439a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) sizeof(GLES2Implementation::GLStaticState::IntState) * 2 + 440a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) sizeof(cmds::GetShaderPrecisionFormat::Result) * 12); 441a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 442a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) { 443a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) InSequence sequence; 444a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 445a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_CALL(*command_buffer_, OnFlush()) 446a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) .WillOnce(SetMemory(mem1.ptr + sizeof(int_state), int_state)) 447a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) .RetiresOnSaturation(); 448a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetNextToken(); // eat the token that starting up will use. 449a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 450e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch gl_.reset(new GLES2Implementation(helper_.get(), 451e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch share_group, 452e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch transfer_buffer_.get(), 4536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bind_generates_resource_client, 454e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch lose_context_when_out_of_memory, 455e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch gpu_control_.get())); 456c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 457c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!gl_->Initialize(kTransferBufferSize, 458c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch kTransferBufferSize, 459c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch kTransferBufferSize, 460c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GLES2Implementation::kNoLimit)) 461c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return false; 462a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 463a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 464a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_CALL(*command_buffer_, OnFlush()).Times(1).RetiresOnSaturation(); 465a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) helper_->CommandBufferHelper::Finish(); 466a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ::testing::Mock::VerifyAndClearExpectations(gl_.get()); 467a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 468effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_refptr<Buffer> ring_buffer = helper_->get_ring_buffer(); 469effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch commands_ = static_cast<CommandBufferEntry*>(ring_buffer->memory()) + 4705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu command_buffer()->GetLastState().put_offset; 471a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ClearCommands(); 472a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(transfer_buffer_->InSync()); 473a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 474a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ::testing::Mock::VerifyAndClearExpectations(command_buffer()); 475c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return true; 476a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 477a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 478a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void TearDown() { 479a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Mock::VerifyAndClear(gl_.get()); 480a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_CALL(*command_buffer(), OnFlush()).Times(AnyNumber()); 481a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // For command buffer. 482a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_CALL(*command_buffer(), DestroyTransferBuffer(_)) 483a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) .Times(AtLeast(1)); 484a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gl_.reset(); 485a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 486a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 487a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MockClientCommandBuffer* command_buffer() const { 488a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return command_buffer_.get(); 489a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 490a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 491a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int GetNextToken() { return ++token_; } 492a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 493a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void ClearCommands() { 494effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_refptr<Buffer> ring_buffer = helper_->get_ring_buffer(); 495effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch memset(ring_buffer->memory(), kInitialValue, ring_buffer->size()); 496a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 497a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 498a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<MockClientCommandBuffer> command_buffer_; 499a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<MockClientGpuControl> gpu_control_; 500a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<GLES2CmdHelper> helper_; 501a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<MockTransferBuffer> transfer_buffer_; 502a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<GLES2Implementation> gl_; 503a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CommandBufferEntry* commands_; 504a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int token_; 505a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) }; 506a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 507a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GLES2ImplementationTest() : commands_(NULL) {} 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE; 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE; 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool NoCommandsWritten() { 513effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_refptr<Buffer> ring_buffer = helper_->get_ring_buffer(); 514effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const uint8* cmds = reinterpret_cast<const uint8*>(ring_buffer->memory()); 515effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const uint8* end = cmds + ring_buffer->size(); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (; cmds < end; ++cmds) { 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*cmds != kInitialValue) { 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueryTracker::Query* GetQuery(GLuint id) { 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gl_->query_tracker_->GetQuery(id); 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 528c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch struct ContextInitOptions { 529c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ContextInitOptions() 530c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch : bind_generates_resource_client(true), 531c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bind_generates_resource_service(true), 532c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch lose_context_when_out_of_memory(false) {} 533c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 534c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool bind_generates_resource_client; 535c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool bind_generates_resource_service; 536c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool lose_context_when_out_of_memory; 537c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch }; 538c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 539c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool Initialize(const ContextInitOptions& init_options) { 540c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool success = true; 5416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) share_group_ = new ShareGroup(init_options.bind_generates_resource_client); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 543c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch for (int i = 0; i < kNumTestContexts; i++) { 544c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!test_contexts_[i].Initialize( 545c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch share_group_.get(), 546c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch init_options.bind_generates_resource_client, 5476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) init_options.bind_generates_resource_service, 548c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch init_options.lose_context_when_out_of_memory)) 549c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch success = false; 550c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 552a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Default to test context 0. 553a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gpu_control_ = test_contexts_[0].gpu_control_.get(); 554a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) helper_ = test_contexts_[0].helper_.get(); 555a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) transfer_buffer_ = test_contexts_[0].transfer_buffer_.get(); 556a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gl_ = test_contexts_[0].gl_.get(); 557a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) commands_ = test_contexts_[0].commands_; 558c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return success; 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockClientCommandBuffer* command_buffer() const { 562a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return test_contexts_[0].command_buffer_.get(); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int GetNextToken() { return test_contexts_[0].GetNextToken(); } 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void* GetPut() { 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return helper_->GetSpace(0); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ClearCommands() { 572effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_refptr<Buffer> ring_buffer = helper_->get_ring_buffer(); 573effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch memset(ring_buffer->memory(), kInitialValue, ring_buffer->size()); 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t MaxTransferBufferSize() { 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return transfer_buffer_->MaxTransferBufferSize(); 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo GetExpectedMemory(size_t size) { 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return transfer_buffer_->GetExpectedMemory(size); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo GetExpectedResultMemory(size_t size) { 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return transfer_buffer_->GetExpectedResultMemory(size); 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the ProgramInfoManager. The manager will be owned 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // by the ShareGroup. 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetProgramInfoManager(ProgramInfoManager* manager) { 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->share_group()->set_program_info_manager(manager); 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int CheckError() { 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo result = 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExpectedResultMemory(sizeof(cmds::GetError::Result)); 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*command_buffer(), OnFlush()) 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetMemory(result.ptr, GLuint(GL_NO_ERROR))) 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gl_->GetError(); 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const std::string& GetLastError() { 6045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return gl_->GetLastError(); 6055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 6065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool GetBucketContents(uint32 bucket_id, std::vector<int8>* data) { 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gl_->GetBucketContents(bucket_id, data); 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 611a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TestContext test_contexts_[kNumTestContexts]; 612a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 613a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_refptr<ShareGroup> share_group_; 614a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MockClientGpuControl* gpu_control_; 615a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GLES2CmdHelper* helper_; 616a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MockTransferBuffer* transfer_buffer_; 617a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GLES2Implementation* gl_; 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandBufferEntry* commands_; 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2ImplementationTest::SetUp() { 622c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ContextInitOptions init_options; 623c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_TRUE(Initialize(init_options)); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2ImplementationTest::TearDown() { 627a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) for (int i = 0; i < kNumTestContexts; i++) 628a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) test_contexts_[i].TearDown(); 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 631e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochclass GLES2ImplementationManualInitTest : public GLES2ImplementationTest { 632e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch protected: 633e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch virtual void SetUp() OVERRIDE {} 634e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}; 635e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GLES2ImplementationStrictSharedTest : public GLES2ImplementationTest { 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE; 639a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 640a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) template <class ResApi> 641a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void FlushGenerationTest() { 642a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GLuint id1, id2, id3; 643a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 644a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Generate valid id. 645a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ResApi::Gen(gl_, 1, &id1); 646a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_NE(id1, 0u); 647a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 648a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Delete id1 and generate id2. id1 should not be reused. 649a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ResApi::Delete(gl_, 1, &id1); 650a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ResApi::Gen(gl_, 1, &id2); 651a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_NE(id2, 0u); 652a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_NE(id2, id1); 653a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 654a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Expect id1 reuse after Flush. 655a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gl_->Flush(); 656a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ResApi::Gen(gl_, 1, &id3); 657a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(id3, id1); 658a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 659a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 660a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Ids should not be reused unless the |Deleting| context does a Flush() 661a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // AND triggers a lazy release after that. 662a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) template <class ResApi> 663a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void CrossContextGenerationTest() { 664a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GLES2Implementation* gl1 = test_contexts_[0].gl_.get(); 665a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GLES2Implementation* gl2 = test_contexts_[1].gl_.get(); 666a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GLuint id1, id2, id3; 667a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 668a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Delete, no flush on context 1. No reuse. 669a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ResApi::Gen(gl1, 1, &id1); 670a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ResApi::Delete(gl1, 1, &id1); 671a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ResApi::Gen(gl1, 1, &id2); 672a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_NE(id1, id2); 673a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 674a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Flush context 2. Still no reuse. 675a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gl2->Flush(); 676a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ResApi::Gen(gl2, 1, &id3); 677a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_NE(id1, id3); 678a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_NE(id2, id3); 679a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 680a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Flush on context 1, but no lazy release. Still no reuse. 681a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gl1->Flush(); 682a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ResApi::Gen(gl2, 1, &id3); 683a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_NE(id1, id3); 684a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 685a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Lazy release triggered by another Delete. Should reuse id1. 686a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ResApi::Delete(gl1, 1, &id2); 687a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ResApi::Gen(gl2, 1, &id3); 688a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(id1, id3); 689a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 690a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 691a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Same as CrossContextGenerationTest(), but triggers an Auto Flush on 692a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // the Delete(). Tests an edge case regression. 693a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) template <class ResApi> 694a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void CrossContextGenerationAutoFlushTest() { 695a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GLES2Implementation* gl1 = test_contexts_[0].gl_.get(); 696a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GLES2Implementation* gl2 = test_contexts_[1].gl_.get(); 697a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GLuint id1, id2, id3; 698a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 699a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Delete, no flush on context 1. No reuse. 700a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // By half filling the buffer, an internal flush is forced on the Delete(). 701a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ResApi::Gen(gl1, 1, &id1); 702a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gl1->helper()->Noop(kNumCommandEntries / 2); 703a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ResApi::Delete(gl1, 1, &id1); 704a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ResApi::Gen(gl1, 1, &id2); 705a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_NE(id1, id2); 706a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 707a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Flush context 2. Still no reuse. 708a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gl2->Flush(); 709a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ResApi::Gen(gl2, 1, &id3); 710a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_NE(id1, id3); 711a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_NE(id2, id3); 712a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 713a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Flush on context 1, but no lazy release. Still no reuse. 714a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gl1->Flush(); 715a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ResApi::Gen(gl2, 1, &id3); 716a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_NE(id1, id3); 717a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 718a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Lazy release triggered by another Delete. Should reuse id1. 719a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ResApi::Delete(gl1, 1, &id2); 720a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ResApi::Gen(gl2, 1, &id3); 721a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(id1, id3); 722a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2ImplementationStrictSharedTest::SetUp() { 726c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ContextInitOptions init_options; 727c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch init_options.bind_generates_resource_client = false; 728c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch init_options.bind_generates_resource_service = false; 729c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_TRUE(Initialize(init_options)); 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GCC requires these declarations, but MSVC requires they not be present 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef _MSC_VER 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint8 GLES2ImplementationTest::kInitialValue; 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 GLES2ImplementationTest::kNumCommandEntries; 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 GLES2ImplementationTest::kCommandBufferSizeBytes; 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const size_t GLES2ImplementationTest::kTransferBufferSize; 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2ImplementationTest::kMaxCombinedTextureImageUnits; 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2ImplementationTest::kMaxCubeMapTextureSize; 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2ImplementationTest::kMaxFragmentUniformVectors; 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2ImplementationTest::kMaxRenderbufferSize; 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2ImplementationTest::kMaxTextureImageUnits; 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2ImplementationTest::kMaxTextureSize; 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2ImplementationTest::kMaxVaryingVectors; 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2ImplementationTest::kMaxVertexAttribs; 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2ImplementationTest::kMaxVertexTextureImageUnits; 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2ImplementationTest::kMaxVertexUniformVectors; 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2ImplementationTest::kNumCompressedTextureFormats; 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2ImplementationTest::kNumShaderBinaryFormats; 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2ImplementationTest::kStartId; 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2ImplementationTest::kBuffersStartId; 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2ImplementationTest::kFramebuffersStartId; 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2ImplementationTest::kProgramsAndShadersStartId; 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2ImplementationTest::kRenderbuffersStartId; 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2ImplementationTest::kTexturesStartId; 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2ImplementationTest::kQueriesStartId; 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2ImplementationTest::kVertexArraysStartId; 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, Basic) { 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(gl_->share_group() != NULL); 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, GetBucketContents) { 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kBucketId = GLES2Implementation::kResultBucketId; 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kTestSize = MaxTransferBufferSize() + 32; 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<uint8[]> buf(new uint8 [kTestSize]); 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8* expected_data = buf.get(); 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (uint32 ii = 0; ii < kTestSize; ++ii) { 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_data[ii] = ii * 3; 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct Cmds { 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::GetBucketStart get_bucket_start; 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetToken set_token1; 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::GetBucketData get_bucket_data; 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetToken set_token2; 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetBucketSize set_bucket_size2; 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem1 = GetExpectedMemory(MaxTransferBufferSize()); 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo result1 = GetExpectedResultMemory(sizeof(uint32)); 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem2 = GetExpectedMemory( 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTestSize - MaxTransferBufferSize()); 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Cmds expected; 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.get_bucket_start.Init( 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kBucketId, result1.id, result1.offset, 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MaxTransferBufferSize(), mem1.id, mem1.offset); 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_token1.Init(GetNextToken()); 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.get_bucket_data.Init( 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kBucketId, MaxTransferBufferSize(), 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTestSize - MaxTransferBufferSize(), mem2.id, mem2.offset); 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_bucket_size2.Init(kBucketId, 0); 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_token2.Init(GetNextToken()); 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*command_buffer(), OnFlush()) 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(DoAll( 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMemory(result1.ptr, kTestSize), 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMemoryFromArray( 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mem1.ptr, expected_data, MaxTransferBufferSize()))) 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetMemoryFromArray( 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mem2.ptr, expected_data + MaxTransferBufferSize(), 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTestSize - MaxTransferBufferSize())) 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<int8> data; 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetBucketContents(kBucketId, &data); 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(kTestSize, data.size()); 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(expected_data, &data[0], data.size())); 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(GLES2ImplementationTest, GetShaderPrecisionFormat) { 8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct Cmds { 8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::GetShaderPrecisionFormat cmd; 8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef cmds::GetShaderPrecisionFormat::Result Result; 8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The first call for mediump should trigger a command buffer request. 8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLint range1[2] = {0, 0}; 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLint precision1 = 0; 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Cmds expected1; 8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExpectedMemoryInfo client_result1 = GetExpectedResultMemory(4); 8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected1.cmd.Init(GL_FRAGMENT_SHADER, GL_MEDIUM_FLOAT, 8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_result1.id, client_result1.offset); 8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Result server_result1 = {true, 14, 14, 10}; 8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*command_buffer(), OnFlush()) 8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .WillOnce(SetMemory(client_result1.ptr, server_result1)) 8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .RetiresOnSaturation(); 8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_->GetShaderPrecisionFormat(GL_FRAGMENT_SHADER, GL_MEDIUM_FLOAT, 8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) range1, &precision1); 8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const void* commands2 = GetPut(); 8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(commands_, commands2); 8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, memcmp(&expected1, commands_, sizeof(expected1))); 8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(range1[0], 14); 8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(range1[1], 14); 8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(precision1, 10); 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The second call for mediump should use the cached value and avoid 8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // triggering a command buffer request, so we do not expect a call to 8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // OnFlush() here. We do expect the results to be correct though. 8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLint range2[2] = {0, 0}; 8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLint precision2 = 0; 8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_->GetShaderPrecisionFormat(GL_FRAGMENT_SHADER, GL_MEDIUM_FLOAT, 8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) range2, &precision2); 8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const void* commands3 = GetPut(); 8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(commands2, commands3); 8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(range2[0], 14); 8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(range2[1], 14); 8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(precision2, 10); 8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If we then make a request for highp, we should get another command 8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // buffer request since it hasn't been cached yet. 8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLint range3[2] = {0, 0}; 8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLint precision3 = 0; 8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Cmds expected3; 8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExpectedMemoryInfo result3 = GetExpectedResultMemory(4); 8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected3.cmd.Init(GL_FRAGMENT_SHADER, GL_HIGH_FLOAT, 8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result3.id, result3.offset); 8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Result result3_source = {true, 62, 62, 16}; 8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*command_buffer(), OnFlush()) 8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .WillOnce(SetMemory(result3.ptr, result3_source)) 8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .RetiresOnSaturation(); 8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_->GetShaderPrecisionFormat(GL_FRAGMENT_SHADER, GL_HIGH_FLOAT, 8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) range3, &precision3); 8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const void* commands4 = GetPut(); 8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(commands3, commands4); 8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, memcmp(&expected3, commands3, sizeof(expected3))); 8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(range3[0], 62); 8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(range3[1], 62); 8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(precision3, 16); 8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, ShaderSource) { 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kBucketId = GLES2Implementation::kResultBucketId; 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kShaderId = 456; 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* kString1 = "foobar"; 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* kString2 = "barfoo"; 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t kString1Size = strlen(kString1); 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t kString2Size = strlen(kString2); 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t kString3Size = 1; // Want the NULL; 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t kSourceSize = kString1Size + kString2Size + kString3Size; 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t kPaddedString1Size = 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transfer_buffer_->RoundToAlignment(kString1Size); 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t kPaddedString2Size = 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transfer_buffer_->RoundToAlignment(kString2Size); 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t kPaddedString3Size = 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transfer_buffer_->RoundToAlignment(kString3Size); 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct Cmds { 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetBucketSize set_bucket_size; 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetBucketData set_bucket_data1; 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetToken set_token1; 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetBucketData set_bucket_data2; 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetToken set_token2; 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetBucketData set_bucket_data3; 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetToken set_token3; 8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::ShaderSourceBucket shader_source_bucket; 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetBucketSize clear_bucket_size; 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem1 = GetExpectedMemory(kPaddedString1Size); 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem2 = GetExpectedMemory(kPaddedString2Size); 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem3 = GetExpectedMemory(kPaddedString3Size); 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Cmds expected; 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_bucket_size.Init(kBucketId, kSourceSize); 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_bucket_data1.Init( 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kBucketId, 0, kString1Size, mem1.id, mem1.offset); 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_token1.Init(GetNextToken()); 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_bucket_data2.Init( 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kBucketId, kString1Size, kString2Size, mem2.id, mem2.offset); 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_token2.Init(GetNextToken()); 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_bucket_data3.Init( 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kBucketId, kString1Size + kString2Size, 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kString3Size, mem3.id, mem3.offset); 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_token3.Init(GetNextToken()); 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.shader_source_bucket.Init(kShaderId, kBucketId); 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.clear_bucket_size.Init(kBucketId, 0); 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* strings[] = { 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kString1, 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kString2, 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->ShaderSource(kShaderId, 2, strings, NULL); 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, GetShaderSource) { 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kBucketId = GLES2Implementation::kResultBucketId; 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kShaderId = 456; 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Str7 kString = {"foobar"}; 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kBad = 0x12; 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct Cmds { 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetBucketSize set_bucket_size1; 9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::GetShaderSource get_shader_source; 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::GetBucketStart get_bucket_start; 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetToken set_token1; 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetBucketSize set_bucket_size2; 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem1 = GetExpectedMemory(MaxTransferBufferSize()); 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo result1 = GetExpectedResultMemory(sizeof(uint32)); 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Cmds expected; 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_bucket_size1.Init(kBucketId, 0); 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.get_shader_source.Init(kShaderId, kBucketId); 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.get_bucket_start.Init( 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kBucketId, result1.id, result1.offset, 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MaxTransferBufferSize(), mem1.id, mem1.offset); 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_token1.Init(GetNextToken()); 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_bucket_size2.Init(kBucketId, 0); 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char buf[sizeof(kString) + 1]; 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(buf, kBad, sizeof(buf)); 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*command_buffer(), OnFlush()) 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(DoAll(SetMemory(result1.ptr, uint32(sizeof(kString))), 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMemory(mem1.ptr, kString))) 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLsizei length = 0; 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->GetShaderSource(kShaderId, sizeof(buf), &length, buf); 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(sizeof(kString) - 1, static_cast<size_t>(length)); 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ(kString.str, buf); 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(buf[sizeof(kString)], kBad); 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, DrawArraysClientSideBuffers) { 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const float verts[][4] = { 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 12.0f, 23.0f, 34.0f, 45.0f, }, 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 56.0f, 67.0f, 78.0f, 89.0f, }, 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 13.0f, 24.0f, 35.0f, 46.0f, }, 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct Cmds { 9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::EnableVertexAttribArray enable1; 9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::EnableVertexAttribArray enable2; 9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BindBuffer bind_to_emu; 9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BufferData set_size; 9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BufferSubData copy_data1; 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetToken set_token1; 9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::VertexAttribPointer set_pointer1; 9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BufferSubData copy_data2; 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetToken set_token2; 9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::VertexAttribPointer set_pointer2; 9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::DrawArrays draw; 9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BindBuffer restore; 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kEmuBufferId = GLES2Implementation::kClientSideArrayId; 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kAttribIndex1 = 1; 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kAttribIndex2 = 3; 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kNumComponents1 = 3; 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kNumComponents2 = 2; 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kClientStride = sizeof(verts[0]); 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kFirst = 1; 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kCount = 2; 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kSize1 = 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arraysize(verts) * kNumComponents1 * sizeof(verts[0][0]); 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kSize2 = 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arraysize(verts) * kNumComponents2 * sizeof(verts[0][0]); 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kEmuOffset1 = 0; 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kEmuOffset2 = kSize1; 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kTotalSize = kSize1 + kSize2; 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem1 = GetExpectedMemory(kSize1); 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem2 = GetExpectedMemory(kSize2); 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Cmds expected; 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.enable1.Init(kAttribIndex1); 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.enable2.Init(kAttribIndex2); 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.bind_to_emu.Init(GL_ARRAY_BUFFER, kEmuBufferId); 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_size.Init(GL_ARRAY_BUFFER, kTotalSize, 0, 0, GL_DYNAMIC_DRAW); 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.copy_data1.Init( 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_ARRAY_BUFFER, kEmuOffset1, kSize1, mem1.id, mem1.offset); 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_token1.Init(GetNextToken()); 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_pointer1.Init( 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kAttribIndex1, kNumComponents1, GL_FLOAT, GL_FALSE, 0, kEmuOffset1); 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.copy_data2.Init( 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_ARRAY_BUFFER, kEmuOffset2, kSize2, mem2.id, mem2.offset); 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_token2.Init(GetNextToken()); 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_pointer2.Init( 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kAttribIndex2, kNumComponents2, GL_FLOAT, GL_FALSE, 0, kEmuOffset2); 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.draw.Init(GL_POINTS, kFirst, kCount); 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.restore.Init(GL_ARRAY_BUFFER, 0); 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->EnableVertexAttribArray(kAttribIndex1); 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->EnableVertexAttribArray(kAttribIndex2); 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->VertexAttribPointer( 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kAttribIndex1, kNumComponents1, GL_FLOAT, GL_FALSE, kClientStride, verts); 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->VertexAttribPointer( 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kAttribIndex2, kNumComponents2, GL_FLOAT, GL_FALSE, kClientStride, verts); 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->DrawArrays(GL_POINTS, kFirst, kCount); 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, DrawArraysInstancedANGLEClientSideBuffers) { 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const float verts[][4] = { 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 12.0f, 23.0f, 34.0f, 45.0f, }, 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 56.0f, 67.0f, 78.0f, 89.0f, }, 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 13.0f, 24.0f, 35.0f, 46.0f, }, 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct Cmds { 10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::EnableVertexAttribArray enable1; 10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::EnableVertexAttribArray enable2; 10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::VertexAttribDivisorANGLE divisor; 10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BindBuffer bind_to_emu; 10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BufferData set_size; 10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BufferSubData copy_data1; 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetToken set_token1; 10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::VertexAttribPointer set_pointer1; 10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BufferSubData copy_data2; 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetToken set_token2; 10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::VertexAttribPointer set_pointer2; 10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::DrawArraysInstancedANGLE draw; 10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BindBuffer restore; 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kEmuBufferId = GLES2Implementation::kClientSideArrayId; 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kAttribIndex1 = 1; 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kAttribIndex2 = 3; 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kNumComponents1 = 3; 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kNumComponents2 = 2; 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kClientStride = sizeof(verts[0]); 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kFirst = 1; 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kCount = 2; 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kDivisor = 1; 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kSize1 = 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arraysize(verts) * kNumComponents1 * sizeof(verts[0][0]); 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kSize2 = 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1 * kNumComponents2 * sizeof(verts[0][0]); 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kEmuOffset1 = 0; 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kEmuOffset2 = kSize1; 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kTotalSize = kSize1 + kSize2; 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem1 = GetExpectedMemory(kSize1); 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem2 = GetExpectedMemory(kSize2); 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Cmds expected; 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.enable1.Init(kAttribIndex1); 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.enable2.Init(kAttribIndex2); 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.divisor.Init(kAttribIndex2, kDivisor); 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.bind_to_emu.Init(GL_ARRAY_BUFFER, kEmuBufferId); 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_size.Init(GL_ARRAY_BUFFER, kTotalSize, 0, 0, GL_DYNAMIC_DRAW); 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.copy_data1.Init( 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_ARRAY_BUFFER, kEmuOffset1, kSize1, mem1.id, mem1.offset); 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_token1.Init(GetNextToken()); 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_pointer1.Init( 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kAttribIndex1, kNumComponents1, GL_FLOAT, GL_FALSE, 0, kEmuOffset1); 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.copy_data2.Init( 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_ARRAY_BUFFER, kEmuOffset2, kSize2, mem2.id, mem2.offset); 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_token2.Init(GetNextToken()); 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_pointer2.Init( 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kAttribIndex2, kNumComponents2, GL_FLOAT, GL_FALSE, 0, kEmuOffset2); 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.draw.Init(GL_POINTS, kFirst, kCount, 1); 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.restore.Init(GL_ARRAY_BUFFER, 0); 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->EnableVertexAttribArray(kAttribIndex1); 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->EnableVertexAttribArray(kAttribIndex2); 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->VertexAttribPointer( 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kAttribIndex1, kNumComponents1, GL_FLOAT, GL_FALSE, kClientStride, verts); 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->VertexAttribPointer( 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kAttribIndex2, kNumComponents2, GL_FLOAT, GL_FALSE, kClientStride, verts); 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->VertexAttribDivisorANGLE(kAttribIndex2, kDivisor); 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->DrawArraysInstancedANGLE(GL_POINTS, kFirst, kCount, 1); 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, DrawElementsClientSideBuffers) { 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const float verts[][4] = { 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 12.0f, 23.0f, 34.0f, 45.0f, }, 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 56.0f, 67.0f, 78.0f, 89.0f, }, 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 13.0f, 24.0f, 35.0f, 46.0f, }, 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const uint16 indices[] = { 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, 2, 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct Cmds { 11172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::EnableVertexAttribArray enable1; 11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::EnableVertexAttribArray enable2; 11192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BindBuffer bind_to_index_emu; 11202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BufferData set_index_size; 11212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BufferSubData copy_data0; 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetToken set_token0; 11232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BindBuffer bind_to_emu; 11242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BufferData set_size; 11252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BufferSubData copy_data1; 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetToken set_token1; 11272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::VertexAttribPointer set_pointer1; 11282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BufferSubData copy_data2; 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetToken set_token2; 11302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::VertexAttribPointer set_pointer2; 11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::DrawElements draw; 11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BindBuffer restore; 11332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BindBuffer restore_element; 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kIndexSize = sizeof(indices); 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kEmuBufferId = GLES2Implementation::kClientSideArrayId; 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kEmuIndexBufferId = 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLES2Implementation::kClientSideElementArrayId; 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kAttribIndex1 = 1; 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kAttribIndex2 = 3; 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kNumComponents1 = 3; 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kNumComponents2 = 2; 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kClientStride = sizeof(verts[0]); 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kCount = 2; 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kSize1 = 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arraysize(verts) * kNumComponents1 * sizeof(verts[0][0]); 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kSize2 = 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arraysize(verts) * kNumComponents2 * sizeof(verts[0][0]); 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kEmuOffset1 = 0; 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kEmuOffset2 = kSize1; 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kTotalSize = kSize1 + kSize2; 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem1 = GetExpectedMemory(kIndexSize); 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem2 = GetExpectedMemory(kSize1); 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem3 = GetExpectedMemory(kSize2); 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Cmds expected; 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.enable1.Init(kAttribIndex1); 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.enable2.Init(kAttribIndex2); 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.bind_to_index_emu.Init(GL_ELEMENT_ARRAY_BUFFER, kEmuIndexBufferId); 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_index_size.Init( 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_ELEMENT_ARRAY_BUFFER, kIndexSize, 0, 0, GL_DYNAMIC_DRAW); 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.copy_data0.Init( 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_ELEMENT_ARRAY_BUFFER, 0, kIndexSize, mem1.id, mem1.offset); 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_token0.Init(GetNextToken()); 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.bind_to_emu.Init(GL_ARRAY_BUFFER, kEmuBufferId); 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_size.Init(GL_ARRAY_BUFFER, kTotalSize, 0, 0, GL_DYNAMIC_DRAW); 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.copy_data1.Init( 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_ARRAY_BUFFER, kEmuOffset1, kSize1, mem2.id, mem2.offset); 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_token1.Init(GetNextToken()); 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_pointer1.Init( 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kAttribIndex1, kNumComponents1, GL_FLOAT, GL_FALSE, 0, kEmuOffset1); 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.copy_data2.Init( 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_ARRAY_BUFFER, kEmuOffset2, kSize2, mem3.id, mem3.offset); 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_token2.Init(GetNextToken()); 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_pointer2.Init(kAttribIndex2, kNumComponents2, 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_FLOAT, GL_FALSE, 0, kEmuOffset2); 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.draw.Init(GL_POINTS, kCount, GL_UNSIGNED_SHORT, 0); 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.restore.Init(GL_ARRAY_BUFFER, 0); 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.restore_element.Init(GL_ELEMENT_ARRAY_BUFFER, 0); 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->EnableVertexAttribArray(kAttribIndex1); 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->EnableVertexAttribArray(kAttribIndex2); 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->VertexAttribPointer(kAttribIndex1, kNumComponents1, 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_FLOAT, GL_FALSE, kClientStride, verts); 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->VertexAttribPointer(kAttribIndex2, kNumComponents2, 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_FLOAT, GL_FALSE, kClientStride, verts); 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->DrawElements(GL_POINTS, kCount, GL_UNSIGNED_SHORT, indices); 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, DrawElementsClientSideBuffersIndexUint) { 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const float verts[][4] = { 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 12.0f, 23.0f, 34.0f, 45.0f, }, 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 56.0f, 67.0f, 78.0f, 89.0f, }, 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 13.0f, 24.0f, 35.0f, 46.0f, }, 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const uint32 indices[] = { 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, 2, 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct Cmds { 12012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::EnableVertexAttribArray enable1; 12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::EnableVertexAttribArray enable2; 12032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BindBuffer bind_to_index_emu; 12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BufferData set_index_size; 12052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BufferSubData copy_data0; 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetToken set_token0; 12072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BindBuffer bind_to_emu; 12082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BufferData set_size; 12092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BufferSubData copy_data1; 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetToken set_token1; 12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::VertexAttribPointer set_pointer1; 12122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BufferSubData copy_data2; 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetToken set_token2; 12142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::VertexAttribPointer set_pointer2; 12152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::DrawElements draw; 12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BindBuffer restore; 12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BindBuffer restore_element; 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kIndexSize = sizeof(indices); 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kEmuBufferId = GLES2Implementation::kClientSideArrayId; 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kEmuIndexBufferId = 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLES2Implementation::kClientSideElementArrayId; 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kAttribIndex1 = 1; 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kAttribIndex2 = 3; 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kNumComponents1 = 3; 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kNumComponents2 = 2; 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kClientStride = sizeof(verts[0]); 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kCount = 2; 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kSize1 = 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arraysize(verts) * kNumComponents1 * sizeof(verts[0][0]); 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kSize2 = 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arraysize(verts) * kNumComponents2 * sizeof(verts[0][0]); 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kEmuOffset1 = 0; 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kEmuOffset2 = kSize1; 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kTotalSize = kSize1 + kSize2; 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem1 = GetExpectedMemory(kIndexSize); 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem2 = GetExpectedMemory(kSize1); 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem3 = GetExpectedMemory(kSize2); 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Cmds expected; 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.enable1.Init(kAttribIndex1); 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.enable2.Init(kAttribIndex2); 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.bind_to_index_emu.Init(GL_ELEMENT_ARRAY_BUFFER, kEmuIndexBufferId); 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_index_size.Init( 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_ELEMENT_ARRAY_BUFFER, kIndexSize, 0, 0, GL_DYNAMIC_DRAW); 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.copy_data0.Init( 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_ELEMENT_ARRAY_BUFFER, 0, kIndexSize, mem1.id, mem1.offset); 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_token0.Init(GetNextToken()); 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.bind_to_emu.Init(GL_ARRAY_BUFFER, kEmuBufferId); 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_size.Init(GL_ARRAY_BUFFER, kTotalSize, 0, 0, GL_DYNAMIC_DRAW); 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.copy_data1.Init( 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_ARRAY_BUFFER, kEmuOffset1, kSize1, mem2.id, mem2.offset); 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_token1.Init(GetNextToken()); 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_pointer1.Init( 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kAttribIndex1, kNumComponents1, GL_FLOAT, GL_FALSE, 0, kEmuOffset1); 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.copy_data2.Init( 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_ARRAY_BUFFER, kEmuOffset2, kSize2, mem3.id, mem3.offset); 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_token2.Init(GetNextToken()); 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_pointer2.Init(kAttribIndex2, kNumComponents2, 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_FLOAT, GL_FALSE, 0, kEmuOffset2); 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.draw.Init(GL_POINTS, kCount, GL_UNSIGNED_INT, 0); 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.restore.Init(GL_ARRAY_BUFFER, 0); 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.restore_element.Init(GL_ELEMENT_ARRAY_BUFFER, 0); 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->EnableVertexAttribArray(kAttribIndex1); 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->EnableVertexAttribArray(kAttribIndex2); 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->VertexAttribPointer(kAttribIndex1, kNumComponents1, 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_FLOAT, GL_FALSE, kClientStride, verts); 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->VertexAttribPointer(kAttribIndex2, kNumComponents2, 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_FLOAT, GL_FALSE, kClientStride, verts); 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->DrawElements(GL_POINTS, kCount, GL_UNSIGNED_INT, indices); 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, DrawElementsClientSideBuffersInvalidIndexUint) { 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const float verts[][4] = { 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 12.0f, 23.0f, 34.0f, 45.0f, }, 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 56.0f, 67.0f, 78.0f, 89.0f, }, 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 13.0f, 24.0f, 35.0f, 46.0f, }, 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const uint32 indices[] = { 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, 0x90000000 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kAttribIndex1 = 1; 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kAttribIndex2 = 3; 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kNumComponents1 = 3; 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kNumComponents2 = 2; 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kClientStride = sizeof(verts[0]); 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kCount = 2; 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*command_buffer(), OnFlush()) 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1) 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->EnableVertexAttribArray(kAttribIndex1); 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->EnableVertexAttribArray(kAttribIndex2); 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->VertexAttribPointer(kAttribIndex1, kNumComponents1, 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_FLOAT, GL_FALSE, kClientStride, verts); 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->VertexAttribPointer(kAttribIndex2, kNumComponents2, 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_FLOAT, GL_FALSE, kClientStride, verts); 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->DrawElements(GL_POINTS, kCount, GL_UNSIGNED_INT, indices); 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), gl_->GetError()); 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DrawElementsClientSideBuffersServiceSideIndices) { 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const float verts[][4] = { 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 12.0f, 23.0f, 34.0f, 45.0f, }, 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 56.0f, 67.0f, 78.0f, 89.0f, }, 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 13.0f, 24.0f, 35.0f, 46.0f, }, 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct Cmds { 13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::EnableVertexAttribArray enable1; 13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::EnableVertexAttribArray enable2; 13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BindBuffer bind_to_index; 13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::GetMaxValueInBufferCHROMIUM get_max; 13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BindBuffer bind_to_emu; 13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BufferData set_size; 13212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BufferSubData copy_data1; 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetToken set_token1; 13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::VertexAttribPointer set_pointer1; 13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BufferSubData copy_data2; 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetToken set_token2; 13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::VertexAttribPointer set_pointer2; 13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::DrawElements draw; 13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BindBuffer restore; 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kEmuBufferId = GLES2Implementation::kClientSideArrayId; 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kClientIndexBufferId = 0x789; 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kIndexOffset = 0x40; 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kMaxIndex = 2; 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kAttribIndex1 = 1; 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kAttribIndex2 = 3; 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kNumComponents1 = 3; 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kNumComponents2 = 2; 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kClientStride = sizeof(verts[0]); 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kCount = 2; 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kSize1 = 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arraysize(verts) * kNumComponents1 * sizeof(verts[0][0]); 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kSize2 = 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arraysize(verts) * kNumComponents2 * sizeof(verts[0][0]); 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kEmuOffset1 = 0; 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kEmuOffset2 = kSize1; 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kTotalSize = kSize1 + kSize2; 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem1 = GetExpectedResultMemory(sizeof(uint32)); 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem2 = GetExpectedMemory(kSize1); 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem3 = GetExpectedMemory(kSize2); 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Cmds expected; 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.enable1.Init(kAttribIndex1); 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.enable2.Init(kAttribIndex2); 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.bind_to_index.Init(GL_ELEMENT_ARRAY_BUFFER, kClientIndexBufferId); 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.get_max.Init(kClientIndexBufferId, kCount, GL_UNSIGNED_SHORT, 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kIndexOffset, mem1.id, mem1.offset); 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.bind_to_emu.Init(GL_ARRAY_BUFFER, kEmuBufferId); 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_size.Init(GL_ARRAY_BUFFER, kTotalSize, 0, 0, GL_DYNAMIC_DRAW); 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.copy_data1.Init( 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_ARRAY_BUFFER, kEmuOffset1, kSize1, mem2.id, mem2.offset); 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_token1.Init(GetNextToken()); 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_pointer1.Init(kAttribIndex1, kNumComponents1, 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_FLOAT, GL_FALSE, 0, kEmuOffset1); 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.copy_data2.Init( 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_ARRAY_BUFFER, kEmuOffset2, kSize2, mem3.id, mem3.offset); 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_token2.Init(GetNextToken()); 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_pointer2.Init(kAttribIndex2, kNumComponents2, 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_FLOAT, GL_FALSE, 0, kEmuOffset2); 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.draw.Init(GL_POINTS, kCount, GL_UNSIGNED_SHORT, kIndexOffset); 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.restore.Init(GL_ARRAY_BUFFER, 0); 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*command_buffer(), OnFlush()) 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetMemory(mem1.ptr,kMaxIndex)) 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->EnableVertexAttribArray(kAttribIndex1); 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->EnableVertexAttribArray(kAttribIndex2); 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->BindBuffer(GL_ELEMENT_ARRAY_BUFFER, kClientIndexBufferId); 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->VertexAttribPointer(kAttribIndex1, kNumComponents1, 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_FLOAT, GL_FALSE, kClientStride, verts); 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->VertexAttribPointer(kAttribIndex2, kNumComponents2, 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_FLOAT, GL_FALSE, kClientStride, verts); 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->DrawElements(GL_POINTS, kCount, GL_UNSIGNED_SHORT, 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<const void*>(kIndexOffset)); 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, DrawElementsInstancedANGLEClientSideBuffers) { 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const float verts[][4] = { 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 12.0f, 23.0f, 34.0f, 45.0f, }, 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 56.0f, 67.0f, 78.0f, 89.0f, }, 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 13.0f, 24.0f, 35.0f, 46.0f, }, 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const uint16 indices[] = { 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, 2, 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct Cmds { 14002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::EnableVertexAttribArray enable1; 14012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::EnableVertexAttribArray enable2; 14022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::VertexAttribDivisorANGLE divisor; 14032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BindBuffer bind_to_index_emu; 14042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BufferData set_index_size; 14052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BufferSubData copy_data0; 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetToken set_token0; 14072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BindBuffer bind_to_emu; 14082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BufferData set_size; 14092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BufferSubData copy_data1; 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetToken set_token1; 14112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::VertexAttribPointer set_pointer1; 14122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BufferSubData copy_data2; 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetToken set_token2; 14142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::VertexAttribPointer set_pointer2; 14152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::DrawElementsInstancedANGLE draw; 14162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BindBuffer restore; 14172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BindBuffer restore_element; 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kIndexSize = sizeof(indices); 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kEmuBufferId = GLES2Implementation::kClientSideArrayId; 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kEmuIndexBufferId = 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLES2Implementation::kClientSideElementArrayId; 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kAttribIndex1 = 1; 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kAttribIndex2 = 3; 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kNumComponents1 = 3; 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kNumComponents2 = 2; 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kClientStride = sizeof(verts[0]); 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kCount = 2; 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kSize1 = 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arraysize(verts) * kNumComponents1 * sizeof(verts[0][0]); 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kSize2 = 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1 * kNumComponents2 * sizeof(verts[0][0]); 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kDivisor = 1; 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kEmuOffset1 = 0; 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kEmuOffset2 = kSize1; 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kTotalSize = kSize1 + kSize2; 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem1 = GetExpectedMemory(kIndexSize); 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem2 = GetExpectedMemory(kSize1); 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem3 = GetExpectedMemory(kSize2); 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Cmds expected; 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.enable1.Init(kAttribIndex1); 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.enable2.Init(kAttribIndex2); 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.divisor.Init(kAttribIndex2, kDivisor); 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.bind_to_index_emu.Init(GL_ELEMENT_ARRAY_BUFFER, kEmuIndexBufferId); 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_index_size.Init( 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_ELEMENT_ARRAY_BUFFER, kIndexSize, 0, 0, GL_DYNAMIC_DRAW); 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.copy_data0.Init( 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_ELEMENT_ARRAY_BUFFER, 0, kIndexSize, mem1.id, mem1.offset); 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_token0.Init(GetNextToken()); 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.bind_to_emu.Init(GL_ARRAY_BUFFER, kEmuBufferId); 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_size.Init(GL_ARRAY_BUFFER, kTotalSize, 0, 0, GL_DYNAMIC_DRAW); 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.copy_data1.Init( 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_ARRAY_BUFFER, kEmuOffset1, kSize1, mem2.id, mem2.offset); 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_token1.Init(GetNextToken()); 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_pointer1.Init( 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kAttribIndex1, kNumComponents1, GL_FLOAT, GL_FALSE, 0, kEmuOffset1); 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.copy_data2.Init( 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_ARRAY_BUFFER, kEmuOffset2, kSize2, mem3.id, mem3.offset); 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_token2.Init(GetNextToken()); 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_pointer2.Init(kAttribIndex2, kNumComponents2, 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_FLOAT, GL_FALSE, 0, kEmuOffset2); 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.draw.Init(GL_POINTS, kCount, GL_UNSIGNED_SHORT, 0, 1); 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.restore.Init(GL_ARRAY_BUFFER, 0); 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.restore_element.Init(GL_ELEMENT_ARRAY_BUFFER, 0); 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->EnableVertexAttribArray(kAttribIndex1); 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->EnableVertexAttribArray(kAttribIndex2); 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->VertexAttribPointer(kAttribIndex1, kNumComponents1, 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_FLOAT, GL_FALSE, kClientStride, verts); 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->VertexAttribPointer(kAttribIndex2, kNumComponents2, 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_FLOAT, GL_FALSE, kClientStride, verts); 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->VertexAttribDivisorANGLE(kAttribIndex2, kDivisor); 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->DrawElementsInstancedANGLE( 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_POINTS, kCount, GL_UNSIGNED_SHORT, indices, 1); 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, GetVertexBufferPointerv) { 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const float verts[1] = { 0.0f, }; 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kAttribIndex1 = 1; 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kAttribIndex2 = 3; 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kNumComponents1 = 3; 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kNumComponents2 = 2; 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kStride1 = 12; 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kStride2 = 0; 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kBufferId = 0x123; 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kOffset2 = 0x456; 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // It's all cached on the client side so no get commands are issued. 14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct Cmds { 14922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BindBuffer bind; 14932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::VertexAttribPointer set_pointer; 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Cmds expected; 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.bind.Init(GL_ARRAY_BUFFER, kBufferId); 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_pointer.Init(kAttribIndex2, kNumComponents2, GL_FLOAT, GL_FALSE, 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kStride2, kOffset2); 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set one client side buffer. 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->VertexAttribPointer(kAttribIndex1, kNumComponents1, 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_FLOAT, GL_FALSE, kStride1, verts); 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set one VBO 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->BindBuffer(GL_ARRAY_BUFFER, kBufferId); 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->VertexAttribPointer(kAttribIndex2, kNumComponents2, 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_FLOAT, GL_FALSE, kStride2, 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<const void*>(kOffset2)); 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // now get them both. 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* ptr1 = NULL; 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* ptr2 = NULL; 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->GetVertexAttribPointerv( 15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kAttribIndex1, GL_VERTEX_ATTRIB_ARRAY_POINTER, &ptr1); 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->GetVertexAttribPointerv( 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kAttribIndex2, GL_VERTEX_ATTRIB_ARRAY_POINTER, &ptr2); 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(static_cast<const void*>(&verts) == ptr1); 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ptr2 == reinterpret_cast<void*>(kOffset2)); 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, GetVertexAttrib) { 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const float verts[1] = { 0.0f, }; 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kAttribIndex1 = 1; 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kAttribIndex2 = 3; 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kNumComponents1 = 3; 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kNumComponents2 = 2; 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kStride1 = 12; 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kStride2 = 0; 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kBufferId = 0x123; 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kOffset2 = 0x456; 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only one set and one get because the client side buffer's info is stored 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // on the client side. 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct Cmds { 15372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::EnableVertexAttribArray enable; 15382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BindBuffer bind; 15392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::VertexAttribPointer set_pointer; 15402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::GetVertexAttribfv get2; // for getting the value from attrib1 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem2 = GetExpectedResultMemory(16); 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Cmds expected; 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.enable.Init(kAttribIndex1); 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.bind.Init(GL_ARRAY_BUFFER, kBufferId); 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_pointer.Init(kAttribIndex2, kNumComponents2, GL_FLOAT, GL_FALSE, 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kStride2, kOffset2); 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.get2.Init(kAttribIndex1, 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_CURRENT_VERTEX_ATTRIB, 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mem2.id, mem2.offset); 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FourFloats current_attrib(1.2f, 3.4f, 5.6f, 7.8f); 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // One call to flush to wait for last call to GetVertexAttribiv 15572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // as others are all cached. 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*command_buffer(), OnFlush()) 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetMemory( 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mem2.ptr, SizedResultHelper<FourFloats>(current_attrib))) 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->EnableVertexAttribArray(kAttribIndex1); 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set one client side buffer. 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->VertexAttribPointer(kAttribIndex1, kNumComponents1, 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_FLOAT, GL_FALSE, kStride1, verts); 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set one VBO 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->BindBuffer(GL_ARRAY_BUFFER, kBufferId); 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->VertexAttribPointer(kAttribIndex2, kNumComponents2, 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_FLOAT, GL_FALSE, kStride2, 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<const void*>(kOffset2)); 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // first get the service side once to see that we make a command 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLint buffer_id = 0; 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLint enabled = 0; 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLint size = 0; 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLint stride = 0; 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLint type = 0; 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLint normalized = 1; 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float current[4] = { 0.0f, }; 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->GetVertexAttribiv( 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kAttribIndex2, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, &buffer_id); 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kBufferId, static_cast<GLuint>(buffer_id)); 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->GetVertexAttribiv( 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kAttribIndex1, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, &buffer_id); 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->GetVertexAttribiv( 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kAttribIndex1, GL_VERTEX_ATTRIB_ARRAY_ENABLED, &enabled); 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->GetVertexAttribiv( 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kAttribIndex1, GL_VERTEX_ATTRIB_ARRAY_SIZE, &size); 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->GetVertexAttribiv( 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kAttribIndex1, GL_VERTEX_ATTRIB_ARRAY_STRIDE, &stride); 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->GetVertexAttribiv( 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kAttribIndex1, GL_VERTEX_ATTRIB_ARRAY_TYPE, &type); 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->GetVertexAttribiv( 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kAttribIndex1, GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, &normalized); 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->GetVertexAttribfv( 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kAttribIndex1, GL_CURRENT_VERTEX_ATTRIB, ¤t[0]); 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, buffer_id); 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GL_TRUE, enabled); 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kNumComponents1, size); 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kStride1, stride); 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GL_FLOAT, type); 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GL_FALSE, normalized); 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(¤t_attrib, ¤t, sizeof(current_attrib))); 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, ReservedIds) { 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only the get error command should be issued. 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct Cmds { 16132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::GetError get; 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Cmds expected; 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExpectedMemoryInfo mem1 = GetExpectedResultMemory( 16182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sizeof(cmds::GetError::Result)); 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.get.Init(mem1.id, mem1.offset); 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // One call to flush to wait for GetError 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*command_buffer(), OnFlush()) 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetMemory(mem1.ptr, GLuint(GL_NO_ERROR))) 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->BindBuffer( 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_ARRAY_BUFFER, 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLES2Implementation::kClientSideArrayId); 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->BindBuffer( 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_ARRAY_BUFFER, 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLES2Implementation::kClientSideElementArrayId); 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLenum err = gl_->GetError(); 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), err); 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, ReadPixels2Reads) { 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct Cmds { 16422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::ReadPixels read1; 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetToken set_token1; 16442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::ReadPixels read2; 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetToken set_token2; 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kBytesPerPixel = 4; 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kWidth = 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (kTransferBufferSize - GLES2Implementation::kStartingOffset) / 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kBytesPerPixel; 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kHeight = 2; 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = GL_RGBA; 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kType = GL_UNSIGNED_BYTE; 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem1 = 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetExpectedMemory(kWidth * kHeight / 2 * kBytesPerPixel); 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo result1 = 16582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExpectedResultMemory(sizeof(cmds::ReadPixels::Result)); 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem2 = 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetExpectedMemory(kWidth * kHeight / 2 * kBytesPerPixel); 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo result2 = 16622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExpectedResultMemory(sizeof(cmds::ReadPixels::Result)); 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Cmds expected; 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.read1.Init( 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, kWidth, kHeight / 2, kFormat, kType, 1667a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch mem1.id, mem1.offset, result1.id, result1.offset, 1668a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch false); 16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_token1.Init(GetNextToken()); 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.read2.Init( 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, kHeight / 2, kWidth, kHeight / 2, kFormat, kType, 1672a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch mem2.id, mem2.offset, result2.id, result2.offset, false); 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_token2.Init(GetNextToken()); 1674c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<int8[]> buffer(new int8[kWidth * kHeight * kBytesPerPixel]); 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*command_buffer(), OnFlush()) 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetMemory(result1.ptr, static_cast<uint32>(1))) 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetMemory(result2.ptr, static_cast<uint32>(1))) 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->ReadPixels(0, 0, kWidth, kHeight, kFormat, kType, buffer.get()); 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, ReadPixelsBadFormatType) { 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct Cmds { 16872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::ReadPixels read; 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetToken set_token; 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kBytesPerPixel = 4; 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kWidth = 2; 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kHeight = 2; 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = 0; 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kType = 0; 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem1 = 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetExpectedMemory(kWidth * kHeight * kBytesPerPixel); 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo result1 = 16992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExpectedResultMemory(sizeof(cmds::ReadPixels::Result)); 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Cmds expected; 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.read.Init( 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, kWidth, kHeight, kFormat, kType, 1704a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch mem1.id, mem1.offset, result1.id, result1.offset, false); 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_token.Init(GetNextToken()); 1706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<int8[]> buffer(new int8[kWidth * kHeight * kBytesPerPixel]); 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*command_buffer(), OnFlush()) 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1) 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->ReadPixels(0, 0, kWidth, kHeight, kFormat, kType, buffer.get()); 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, FreeUnusedSharedMemory) { 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct Cmds { 17172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BufferSubData buf; 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetToken set_token; 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kTarget = GL_ELEMENT_ARRAY_BUFFER; 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLintptr kOffset = 15; 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizeiptr kSize = 16; 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem1 = GetExpectedMemory(kSize); 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Cmds expected; 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.buf.Init( 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTarget, kOffset, kSize, mem1.id, mem1.offset); 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_token.Init(GetNextToken()); 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* mem = gl_->MapBufferSubDataCHROMIUM( 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTarget, kOffset, kSize, GL_WRITE_ONLY); 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(mem != NULL); 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->UnmapBufferSubDataCHROMIUM(mem); 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*command_buffer(), DestroyTransferBuffer(_)) 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1) 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->FreeUnusedSharedMemory(); 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, MapUnmapBufferSubDataCHROMIUM) { 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct Cmds { 17432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BufferSubData buf; 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetToken set_token; 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kTarget = GL_ELEMENT_ARRAY_BUFFER; 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLintptr kOffset = 15; 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizeiptr kSize = 16; 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 offset = 0; 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Cmds expected; 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.buf.Init( 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTarget, kOffset, kSize, 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_buffer()->GetNextFreeTransferBufferId(), offset); 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_token.Init(GetNextToken()); 17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* mem = gl_->MapBufferSubDataCHROMIUM( 17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTarget, kOffset, kSize, GL_WRITE_ONLY); 17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(mem != NULL); 17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->UnmapBufferSubDataCHROMIUM(mem); 17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, MapUnmapBufferSubDataCHROMIUMBadArgs) { 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kTarget = GL_ELEMENT_ARRAY_BUFFER; 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLintptr kOffset = 15; 17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizeiptr kSize = 16; 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo result1 = 17702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExpectedResultMemory(sizeof(cmds::GetError::Result)); 17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo result2 = 17722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExpectedResultMemory(sizeof(cmds::GetError::Result)); 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo result3 = 17742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExpectedResultMemory(sizeof(cmds::GetError::Result)); 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo result4 = 17762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExpectedResultMemory(sizeof(cmds::GetError::Result)); 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calls to flush to wait for GetError 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*command_buffer(), OnFlush()) 17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetMemory(result1.ptr, GLuint(GL_NO_ERROR))) 17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetMemory(result2.ptr, GLuint(GL_NO_ERROR))) 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetMemory(result3.ptr, GLuint(GL_NO_ERROR))) 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetMemory(result4.ptr, GLuint(GL_NO_ERROR))) 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* mem; 17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mem = gl_->MapBufferSubDataCHROMIUM(kTarget, -1, kSize, GL_WRITE_ONLY); 17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(mem == NULL); 17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError()); 17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mem = gl_->MapBufferSubDataCHROMIUM(kTarget, kOffset, -1, GL_WRITE_ONLY); 17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(mem == NULL); 17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError()); 17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mem = gl_->MapBufferSubDataCHROMIUM(kTarget, kOffset, kSize, GL_READ_ONLY); 17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(mem == NULL); 17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_INVALID_ENUM), gl_->GetError()); 17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* kPtr = "something"; 17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->UnmapBufferSubDataCHROMIUM(kPtr); 17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError()); 17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, MapUnmapTexSubImage2DCHROMIUM) { 18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct Cmds { 18032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::TexSubImage2D tex; 18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetToken set_token; 18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kLevel = 1; 18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kXOffset = 2; 18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kYOffset = 3; 18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kWidth = 4; 18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kHeight = 5; 18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = GL_RGBA; 18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kType = GL_UNSIGNED_BYTE; 18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 offset = 0; 18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Cmds expected; 18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.tex.Init( 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_TEXTURE_2D, kLevel, kXOffset, kYOffset, kWidth, kHeight, kFormat, 18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kType, 18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_buffer()->GetNextFreeTransferBufferId(), offset, GL_FALSE); 18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_token.Init(GetNextToken()); 18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* mem = gl_->MapTexSubImage2DCHROMIUM( 18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_TEXTURE_2D, 18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kLevel, 18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kXOffset, 18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kYOffset, 18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kWidth, 18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kHeight, 18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kFormat, 18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kType, 18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_WRITE_ONLY); 18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(mem != NULL); 18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->UnmapTexSubImage2DCHROMIUM(mem); 18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); 18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, MapUnmapTexSubImage2DCHROMIUMBadArgs) { 18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kLevel = 1; 18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kXOffset = 2; 18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kYOffset = 3; 18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kWidth = 4; 18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kHeight = 5; 18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = GL_RGBA; 18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kType = GL_UNSIGNED_BYTE; 18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo result1 = 18472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExpectedResultMemory(sizeof(cmds::GetError::Result)); 18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo result2 = 18492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExpectedResultMemory(sizeof(cmds::GetError::Result)); 18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo result3 = 18512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExpectedResultMemory(sizeof(cmds::GetError::Result)); 18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo result4 = 18532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExpectedResultMemory(sizeof(cmds::GetError::Result)); 18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo result5 = 18552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExpectedResultMemory(sizeof(cmds::GetError::Result)); 18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo result6 = 18572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExpectedResultMemory(sizeof(cmds::GetError::Result)); 18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo result7 = 18592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExpectedResultMemory(sizeof(cmds::GetError::Result)); 18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calls to flush to wait for GetError 18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*command_buffer(), OnFlush()) 18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetMemory(result1.ptr, GLuint(GL_NO_ERROR))) 18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetMemory(result2.ptr, GLuint(GL_NO_ERROR))) 18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetMemory(result3.ptr, GLuint(GL_NO_ERROR))) 18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetMemory(result4.ptr, GLuint(GL_NO_ERROR))) 18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetMemory(result5.ptr, GLuint(GL_NO_ERROR))) 18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetMemory(result6.ptr, GLuint(GL_NO_ERROR))) 18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetMemory(result7.ptr, GLuint(GL_NO_ERROR))) 18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* mem; 18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mem = gl_->MapTexSubImage2DCHROMIUM( 18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_TEXTURE_2D, 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) -1, 18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kXOffset, 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kYOffset, 18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kWidth, 18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kHeight, 18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kFormat, 18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kType, 18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_WRITE_ONLY); 18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(mem == NULL); 18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError()); 18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mem = gl_->MapTexSubImage2DCHROMIUM( 18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_TEXTURE_2D, 18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kLevel, 18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) -1, 18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kYOffset, 18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kWidth, 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kHeight, 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kFormat, 18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kType, 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_WRITE_ONLY); 18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(mem == NULL); 18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError()); 18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mem = gl_->MapTexSubImage2DCHROMIUM( 18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_TEXTURE_2D, 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kLevel, 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kXOffset, 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) -1, 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kWidth, 19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kHeight, 19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kFormat, 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kType, 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_WRITE_ONLY); 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(mem == NULL); 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError()); 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mem = gl_->MapTexSubImage2DCHROMIUM( 19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_TEXTURE_2D, 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kLevel, 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kXOffset, 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kYOffset, 19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) -1, 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kHeight, 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kFormat, 19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kType, 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_WRITE_ONLY); 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(mem == NULL); 19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError()); 19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mem = gl_->MapTexSubImage2DCHROMIUM( 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_TEXTURE_2D, 19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kLevel, 19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kXOffset, 19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kYOffset, 19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kWidth, 19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) -1, 19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kFormat, 19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kType, 19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_WRITE_ONLY); 19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(mem == NULL); 19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError()); 19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mem = gl_->MapTexSubImage2DCHROMIUM( 19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_TEXTURE_2D, 19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kLevel, 19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kXOffset, 19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kYOffset, 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kWidth, 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kHeight, 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kFormat, 19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kType, 19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_READ_ONLY); 19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(mem == NULL); 19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_INVALID_ENUM), gl_->GetError()); 19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* kPtr = "something"; 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->UnmapTexSubImage2DCHROMIUM(kPtr); 19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError()); 19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, GetMultipleIntegervCHROMIUMValidArgs) { 19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum pnames[] = { 19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_DEPTH_WRITEMASK, 19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_COLOR_WRITEMASK, 19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_STENCIL_WRITEMASK, 19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint num_results = 6; 19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLint results[num_results + 1]; 19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct Cmds { 19592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::GetMultipleIntegervCHROMIUM get_multiple; 19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetToken set_token; 19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kNumPnames = arraysize(pnames); 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizeiptr kResultsSize = num_results * sizeof(results[0]); 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t kPNamesSize = kNumPnames * sizeof(pnames[0]); 19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem1 = GetExpectedMemory(kPNamesSize + kResultsSize); 19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo result1 = GetExpectedResultMemory( 19682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sizeof(cmds::GetError::Result)); 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kPnamesOffset = mem1.offset; 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kResultsOffset = mem1.offset + kPNamesSize; 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Cmds expected; 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.get_multiple.Init( 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mem1.id, kPnamesOffset, kNumPnames, 19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mem1.id, kResultsOffset, kResultsSize); 19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_token.Init(GetNextToken()); 19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kSentinel = 0x12345678; 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(results, 0, sizeof(results)); 19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) results[num_results] = kSentinel; 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint returned_results[] = { 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, 0, 1, 0, 1, -1, 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // One call to flush to wait for results 19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*command_buffer(), OnFlush()) 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetMemoryFromArray(mem1.ptr + kPNamesSize, 19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) returned_results, sizeof(returned_results))) 19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetMemory(result1.ptr, GLuint(GL_NO_ERROR))) 19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->GetMultipleIntegervCHROMIUM( 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &pnames[0], kNumPnames, &results[0], kResultsSize); 19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(&returned_results, results, sizeof(returned_results))); 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSentinel, results[num_results]); 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), gl_->GetError()); 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, GetMultipleIntegervCHROMIUMBadArgs) { 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLenum pnames[] = { 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_DEPTH_WRITEMASK, 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_COLOR_WRITEMASK, 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_STENCIL_WRITEMASK, 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint num_results = 6; 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLint results[num_results + 1]; 20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kNumPnames = arraysize(pnames); 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizeiptr kResultsSize = num_results * sizeof(results[0]); 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo result1 = 20112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExpectedResultMemory(sizeof(cmds::GetError::Result)); 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo result2 = 20132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExpectedResultMemory(sizeof(cmds::GetError::Result)); 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo result3 = 20152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExpectedResultMemory(sizeof(cmds::GetError::Result)); 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo result4 = 20172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExpectedResultMemory(sizeof(cmds::GetError::Result)); 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calls to flush to wait for GetError 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*command_buffer(), OnFlush()) 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetMemory(result1.ptr, GLuint(GL_NO_ERROR))) 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetMemory(result2.ptr, GLuint(GL_NO_ERROR))) 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetMemory(result3.ptr, GLuint(GL_NO_ERROR))) 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetMemory(result4.ptr, GLuint(GL_NO_ERROR))) 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kSentinel = 0x12345678; 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(results, 0, sizeof(results)); 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) results[num_results] = kSentinel; 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // try bad size. 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->GetMultipleIntegervCHROMIUM( 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &pnames[0], kNumPnames, &results[0], kResultsSize + 1); 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NoCommandsWritten()); 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError()); 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, results[0]); 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSentinel, results[num_results]); 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // try bad size. 20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearCommands(); 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->GetMultipleIntegervCHROMIUM( 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &pnames[0], kNumPnames, &results[0], kResultsSize - 1); 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NoCommandsWritten()); 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError()); 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, results[0]); 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSentinel, results[num_results]); 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // try uncleared results. 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearCommands(); 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) results[2] = 1; 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->GetMultipleIntegervCHROMIUM( 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &pnames[0], kNumPnames, &results[0], kResultsSize); 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NoCommandsWritten()); 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError()); 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, results[0]); 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSentinel, results[num_results]); 20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // try bad enum results. 20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearCommands(); 20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) results[2] = 0; 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pnames[1] = GL_TRUE; 20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->GetMultipleIntegervCHROMIUM( 20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &pnames[0], kNumPnames, &results[0], kResultsSize); 20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NoCommandsWritten()); 20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_INVALID_ENUM), gl_->GetError()); 20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, results[0]); 20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSentinel, results[num_results]); 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, GetProgramInfoCHROMIUMGoodArgs) { 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kBucketId = GLES2Implementation::kResultBucketId; 20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kProgramId = 123; 20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kBad = 0x12; 20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLsizei size = 0; 20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Str7 kString = {"foobar"}; 20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char buf[20]; 20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem1 = 20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetExpectedMemory(MaxTransferBufferSize()); 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo result1 = 20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetExpectedResultMemory(sizeof(cmd::GetBucketStart::Result)); 20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo result2 = 20792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExpectedResultMemory(sizeof(cmds::GetError::Result)); 20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(buf, kBad, sizeof(buf)); 20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*command_buffer(), OnFlush()) 20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(DoAll(SetMemory(result1.ptr, uint32(sizeof(kString))), 20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMemory(mem1.ptr, kString))) 20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetMemory(result2.ptr, GLuint(GL_NO_ERROR))) 20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct Cmds { 20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetBucketSize set_bucket_size1; 20902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::GetProgramInfoCHROMIUM get_program_info; 20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::GetBucketStart get_bucket_start; 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetToken set_token1; 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetBucketSize set_bucket_size2; 20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Cmds expected; 20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_bucket_size1.Init(kBucketId, 0); 20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.get_program_info.Init(kProgramId, kBucketId); 20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.get_bucket_start.Init( 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kBucketId, result1.id, result1.offset, 21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MaxTransferBufferSize(), mem1.id, mem1.offset); 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_token1.Init(GetNextToken()); 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_bucket_size2.Init(kBucketId, 0); 21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->GetProgramInfoCHROMIUM(kProgramId, sizeof(buf), &size, &buf); 21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); 21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), gl_->GetError()); 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(sizeof(kString), static_cast<size_t>(size)); 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ(kString.str, buf); 21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(buf[sizeof(kString)], kBad); 21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, GetProgramInfoCHROMIUMBadArgs) { 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kBucketId = GLES2Implementation::kResultBucketId; 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kProgramId = 123; 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLsizei size = 0; 21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Str7 kString = {"foobar"}; 21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char buf[20]; 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem1 = GetExpectedMemory(MaxTransferBufferSize()); 21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo result1 = 21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetExpectedResultMemory(sizeof(cmd::GetBucketStart::Result)); 21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo result2 = 21222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExpectedResultMemory(sizeof(cmds::GetError::Result)); 21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo result3 = 21242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExpectedResultMemory(sizeof(cmds::GetError::Result)); 21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo result4 = 21262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExpectedResultMemory(sizeof(cmds::GetError::Result)); 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*command_buffer(), OnFlush()) 21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(DoAll(SetMemory(result1.ptr, uint32(sizeof(kString))), 21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMemory(mem1.ptr, kString))) 21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetMemory(result2.ptr, GLuint(GL_NO_ERROR))) 21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetMemory(result3.ptr, GLuint(GL_NO_ERROR))) 21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetMemory(result4.ptr, GLuint(GL_NO_ERROR))) 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // try bufsize not big enough. 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct Cmds { 21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetBucketSize set_bucket_size1; 21392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::GetProgramInfoCHROMIUM get_program_info; 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::GetBucketStart get_bucket_start; 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetToken set_token1; 21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetBucketSize set_bucket_size2; 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Cmds expected; 21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_bucket_size1.Init(kBucketId, 0); 21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.get_program_info.Init(kProgramId, kBucketId); 21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.get_bucket_start.Init( 21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kBucketId, result1.id, result1.offset, 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MaxTransferBufferSize(), mem1.id, mem1.offset); 21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_token1.Init(GetNextToken()); 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_bucket_size2.Init(kBucketId, 0); 21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->GetProgramInfoCHROMIUM(kProgramId, 6, &size, &buf); 21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); 21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), gl_->GetError()); 21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearCommands(); 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // try bad bufsize 21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->GetProgramInfoCHROMIUM(kProgramId, -1, &size, &buf); 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NoCommandsWritten()); 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError()); 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearCommands(); 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // try no size ptr. 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->GetProgramInfoCHROMIUM(kProgramId, sizeof(buf), NULL, &buf); 21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NoCommandsWritten()); 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError()); 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that things are cached 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, GetIntegerCacheRead) { 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct PNameValue { 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLenum pname; 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLint expected; 21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PNameValue pairs[] = { 21754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {GL_ACTIVE_TEXTURE, GL_TEXTURE0, }, 21764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {GL_TEXTURE_BINDING_2D, 0, }, 21774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {GL_TEXTURE_BINDING_CUBE_MAP, 0, }, 21784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {GL_TEXTURE_BINDING_EXTERNAL_OES, 0, }, 21794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {GL_FRAMEBUFFER_BINDING, 0, }, 21804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {GL_RENDERBUFFER_BINDING, 0, }, 21814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {GL_ARRAY_BUFFER_BINDING, 0, }, 21824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {GL_ELEMENT_ARRAY_BUFFER_BINDING, 0, }, 21834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, kMaxCombinedTextureImageUnits, }, 21844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {GL_MAX_CUBE_MAP_TEXTURE_SIZE, kMaxCubeMapTextureSize, }, 21854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {GL_MAX_FRAGMENT_UNIFORM_VECTORS, kMaxFragmentUniformVectors, }, 21864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {GL_MAX_RENDERBUFFER_SIZE, kMaxRenderbufferSize, }, 21874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {GL_MAX_TEXTURE_IMAGE_UNITS, kMaxTextureImageUnits, }, 21884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {GL_MAX_TEXTURE_SIZE, kMaxTextureSize, }, 21894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {GL_MAX_VARYING_VECTORS, kMaxVaryingVectors, }, 21904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {GL_MAX_VERTEX_ATTRIBS, kMaxVertexAttribs, }, 21914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, kMaxVertexTextureImageUnits, }, 21924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {GL_MAX_VERTEX_UNIFORM_VECTORS, kMaxVertexUniformVectors, }, 21934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {GL_NUM_COMPRESSED_TEXTURE_FORMATS, kNumCompressedTextureFormats, }, 21944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {GL_NUM_SHADER_BINARY_FORMATS, kNumShaderBinaryFormats, }, }; 21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t num_pairs = sizeof(pairs) / sizeof(pairs[0]); 21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t ii = 0; ii < num_pairs; ++ii) { 21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PNameValue& pv = pairs[ii]; 21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLint v = -1; 21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->GetIntegerv(pv.pname, &v); 22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NoCommandsWritten()); 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(pv.expected, v); 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo result1 = 22052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExpectedResultMemory(sizeof(cmds::GetError::Result)); 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*command_buffer(), OnFlush()) 22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetMemory(result1.ptr, GLuint(GL_NO_ERROR))) 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), gl_->GetError()); 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, GetIntegerCacheWrite) { 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct PNameValue { 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLenum pname; 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLint expected; 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->ActiveTexture(GL_TEXTURE4); 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->BindBuffer(GL_ARRAY_BUFFER, 2); 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->BindBuffer(GL_ELEMENT_ARRAY_BUFFER, 3); 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->BindFramebuffer(GL_FRAMEBUFFER, 4); 22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->BindRenderbuffer(GL_RENDERBUFFER, 5); 22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->BindTexture(GL_TEXTURE_2D, 6); 22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->BindTexture(GL_TEXTURE_CUBE_MAP, 7); 22254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gl_->BindTexture(GL_TEXTURE_EXTERNAL_OES, 8); 22264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 22274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const PNameValue pairs[] = {{GL_ACTIVE_TEXTURE, GL_TEXTURE4, }, 22284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {GL_ARRAY_BUFFER_BINDING, 2, }, 22294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {GL_ELEMENT_ARRAY_BUFFER_BINDING, 3, }, 22304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {GL_FRAMEBUFFER_BINDING, 4, }, 22314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {GL_RENDERBUFFER_BINDING, 5, }, 22324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {GL_TEXTURE_BINDING_2D, 6, }, 22334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {GL_TEXTURE_BINDING_CUBE_MAP, 7, }, 22344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {GL_TEXTURE_BINDING_EXTERNAL_OES, 8, }, }; 22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t num_pairs = sizeof(pairs) / sizeof(pairs[0]); 22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t ii = 0; ii < num_pairs; ++ii) { 22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PNameValue& pv = pairs[ii]; 22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLint v = -1; 22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->GetIntegerv(pv.pname, &v); 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(pv.expected, v); 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo result1 = 22442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExpectedResultMemory(sizeof(cmds::GetError::Result)); 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*command_buffer(), OnFlush()) 22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetMemory(result1.ptr, GLuint(GL_NO_ERROR))) 22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), gl_->GetError()); 22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static bool CheckRect( 22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int width, int height, GLenum format, GLenum type, int alignment, 22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool flip_y, const uint8* r1, const uint8* r2) { 22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 size = 0; 22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 unpadded_row_size = 0; 22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 padded_row_size = 0; 22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GLES2Util::ComputeImageDataSizes( 22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) width, height, format, type, alignment, &size, &unpadded_row_size, 22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &padded_row_size)) { 22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int r2_stride = flip_y ? 22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) -static_cast<int>(padded_row_size) : 22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(padded_row_size); 22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r2 = flip_y ? (r2 + (height - 1) * padded_row_size) : r2; 22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int y = 0; y < height; ++y) { 22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (memcmp(r1, r2, unpadded_row_size) != 0) { 22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r1 += padded_row_size; 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r2 += r2_stride; 22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P8(CheckRectAction, width, height, format, type, alignment, flip_y, 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r1, r2) { 22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(CheckRect( 22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) width, height, format, type, alignment, flip_y, r1, r2)); 22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test TexImage2D with and without flip_y 22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, TexImage2D) { 22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct Cmds { 22882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::TexImage2D tex_image_2d; 22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetToken set_token; 22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct Cmds2 { 22922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::TexImage2D tex_image_2d; 22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetToken set_token; 22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kTarget = GL_TEXTURE_2D; 22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kLevel = 0; 22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = GL_RGB; 22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kWidth = 3; 22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kHeight = 4; 23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kBorder = 0; 23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kType = GL_UNSIGNED_BYTE; 23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kPixelStoreUnpackAlignment = 4; 23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static uint8 pixels[] = { 23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11, 12, 13, 13, 14, 15, 15, 16, 17, 101, 102, 103, 23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21, 22, 23, 23, 24, 25, 25, 26, 27, 201, 202, 203, 23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31, 32, 33, 33, 34, 35, 35, 36, 37, 123, 124, 125, 23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41, 42, 43, 43, 44, 45, 45, 46, 47, 23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem1 = GetExpectedMemory(sizeof(pixels)); 23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Cmds expected; 23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.tex_image_2d.Init( 2314cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kTarget, kLevel, kFormat, kWidth, kHeight, kFormat, kType, 23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mem1.id, mem1.offset); 23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_token.Init(GetNextToken()); 23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->TexImage2D( 23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTarget, kLevel, kFormat, kWidth, kHeight, kBorder, kFormat, kType, 23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels); 23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); 23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(CheckRect( 23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kWidth, kHeight, kFormat, kType, kPixelStoreUnpackAlignment, false, 23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels, mem1.ptr)); 23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearCommands(); 23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->PixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, GL_TRUE); 23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem2 = GetExpectedMemory(sizeof(pixels)); 23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Cmds2 expected2; 23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected2.tex_image_2d.Init( 2331cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kTarget, kLevel, kFormat, kWidth, kHeight, kFormat, kType, 23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mem2.id, mem2.offset); 23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected2.set_token.Init(GetNextToken()); 23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void* commands2 = GetPut(); 23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->TexImage2D( 23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTarget, kLevel, kFormat, kWidth, kHeight, kBorder, kFormat, kType, 23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels); 23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(&expected2, commands2, sizeof(expected2))); 23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(CheckRect( 23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kWidth, kHeight, kFormat, kType, kPixelStoreUnpackAlignment, true, 23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels, mem2.ptr)); 23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test TexImage2D with 2 writes 23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, TexImage2D2Writes) { 23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct Cmds { 23472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::TexImage2D tex_image_2d; 23482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::TexSubImage2D tex_sub_image_2d1; 23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetToken set_token1; 23502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::TexSubImage2D tex_sub_image_2d2; 23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetToken set_token2; 23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kTarget = GL_TEXTURE_2D; 23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kLevel = 0; 23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = GL_RGB; 23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kBorder = 0; 23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kType = GL_UNSIGNED_BYTE; 23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kPixelStoreUnpackAlignment = 4; 23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kWidth = 3; 23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 size = 0; 23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 unpadded_row_size = 0; 23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 padded_row_size = 0; 23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(GLES2Util::ComputeImageDataSizes( 23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kWidth, 2, kFormat, kType, kPixelStoreUnpackAlignment, 23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &size, &unpadded_row_size, &padded_row_size)); 23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kHeight = (MaxTransferBufferSize() / padded_row_size) * 2; 23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(GLES2Util::ComputeImageDataSizes( 23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kWidth, kHeight, kFormat, kType, kPixelStoreUnpackAlignment, 23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &size, NULL, NULL)); 23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 half_size = 0; 23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(GLES2Util::ComputeImageDataSizes( 23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kWidth, kHeight / 2, kFormat, kType, kPixelStoreUnpackAlignment, 23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &half_size, NULL, NULL)); 23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<uint8[]> pixels(new uint8[size]); 23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (uint32 ii = 0; ii < size; ++ii) { 23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels[ii] = static_cast<uint8>(ii); 23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem1 = GetExpectedMemory(half_size); 23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem2 = GetExpectedMemory(half_size); 23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Cmds expected; 23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.tex_image_2d.Init( 2386cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kTarget, kLevel, kFormat, kWidth, kHeight, kFormat, kType, 23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0); 23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.tex_sub_image_2d1.Init( 23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTarget, kLevel, 0, 0, kWidth, kHeight / 2, kFormat, kType, 23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mem1.id, mem1.offset, true); 23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_token1.Init(GetNextToken()); 23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.tex_sub_image_2d2.Init( 23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTarget, kLevel, 0, kHeight / 2, kWidth, kHeight / 2, kFormat, kType, 23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mem2.id, mem2.offset, true); 23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_token2.Init(GetNextToken()); 23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(gman): Make it possible to run this test 23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // EXPECT_CALL(*command_buffer(), OnFlush()) 23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // .WillOnce(CheckRectAction( 24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // kWidth, kHeight / 2, kFormat, kType, kPixelStoreUnpackAlignment, 24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // false, pixels.get(), 24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GetExpectedTransferAddressFromOffsetAs<uint8>(offset1, half_size))) 24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // .RetiresOnSaturation(); 24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->TexImage2D( 24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTarget, kLevel, kFormat, kWidth, kHeight, kBorder, kFormat, kType, 24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels.get()); 24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); 24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(CheckRect( 24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kWidth, kHeight / 2, kFormat, kType, kPixelStoreUnpackAlignment, false, 24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels.get() + kHeight / 2 * padded_row_size, mem2.ptr)); 24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearCommands(); 24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->PixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, GL_TRUE); 24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void* commands2 = GetPut(); 24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem3 = GetExpectedMemory(half_size); 24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem4 = GetExpectedMemory(half_size); 24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.tex_image_2d.Init( 2419cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kTarget, kLevel, kFormat, kWidth, kHeight, kFormat, kType, 24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0); 24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.tex_sub_image_2d1.Init( 24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTarget, kLevel, 0, kHeight / 2, kWidth, kHeight / 2, kFormat, kType, 24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mem3.id, mem3.offset, true); 24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_token1.Init(GetNextToken()); 24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.tex_sub_image_2d2.Init( 24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTarget, kLevel, 0, 0, kWidth, kHeight / 2, kFormat, kType, 24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mem4.id, mem4.offset, true); 24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_token2.Init(GetNextToken()); 24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(gman): Make it possible to run this test 24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // EXPECT_CALL(*command_buffer(), OnFlush()) 24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // .WillOnce(CheckRectAction( 24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // kWidth, kHeight / 2, kFormat, kType, kPixelStoreUnpackAlignment, 24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // true, pixels.get(), 24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GetExpectedTransferAddressFromOffsetAs<uint8>(offset3, half_size))) 24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // .RetiresOnSaturation(); 24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->TexImage2D( 24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTarget, kLevel, kFormat, kWidth, kHeight, kBorder, kFormat, kType, 24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels.get()); 24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(&expected, commands2, sizeof(expected))); 24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(CheckRect( 24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kWidth, kHeight / 2, kFormat, kType, kPixelStoreUnpackAlignment, true, 24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels.get() + kHeight / 2 * padded_row_size, mem4.ptr)); 24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test TexSubImage2D with GL_PACK_FLIP_Y set and partial multirow transfers 24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, TexSubImage2DFlipY) { 24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kTextureWidth = MaxTransferBufferSize() / 4; 24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kTextureHeight = 7; 24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kSubImageWidth = MaxTransferBufferSize() / 8; 24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kSubImageHeight = 4; 24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kSubImageXOffset = 1; 24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kSubImageYOffset = 2; 24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = GL_RGBA; 24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kType = GL_UNSIGNED_BYTE; 24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kTarget = GL_TEXTURE_2D; 24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kLevel = 0; 24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kBorder = 0; 24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kPixelStoreUnpackAlignment = 4; 24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct Cmds { 24632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::PixelStorei pixel_store_i1; 24642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::TexImage2D tex_image_2d; 24652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::PixelStorei pixel_store_i2; 24662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::TexSubImage2D tex_sub_image_2d1; 24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetToken set_token1; 24682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::TexSubImage2D tex_sub_image_2d2; 24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetToken set_token2; 24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 sub_2_high_size = 0; 24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(GLES2Util::ComputeImageDataSizes( 24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSubImageWidth, 2, kFormat, kType, kPixelStoreUnpackAlignment, 24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &sub_2_high_size, NULL, NULL)); 24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem1 = GetExpectedMemory(sub_2_high_size); 24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem2 = GetExpectedMemory(sub_2_high_size); 24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Cmds expected; 24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.pixel_store_i1.Init(GL_UNPACK_ALIGNMENT, kPixelStoreUnpackAlignment); 24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.tex_image_2d.Init( 2483cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kTarget, kLevel, kFormat, kTextureWidth, kTextureHeight, kFormat, 24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kType, 0, 0); 24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.pixel_store_i2.Init(GL_UNPACK_FLIP_Y_CHROMIUM, GL_TRUE); 24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.tex_sub_image_2d1.Init(kTarget, kLevel, kSubImageXOffset, 24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSubImageYOffset + 2, kSubImageWidth, 2, kFormat, kType, 24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mem1.id, mem1.offset, false); 24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_token1.Init(GetNextToken()); 24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.tex_sub_image_2d2.Init(kTarget, kLevel, kSubImageXOffset, 24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSubImageYOffset, kSubImageWidth , 2, kFormat, kType, 24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mem2.id, mem2.offset, false); 24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_token2.Init(GetNextToken()); 24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->PixelStorei(GL_UNPACK_ALIGNMENT, kPixelStoreUnpackAlignment); 24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->TexImage2D( 24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTarget, kLevel, kFormat, kTextureWidth, kTextureHeight, kBorder, kFormat, 24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kType, NULL); 24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->PixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, GL_TRUE); 2500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<uint32[]> pixels(new uint32[kSubImageWidth * kSubImageHeight]); 25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int y = 0; y < kSubImageHeight; ++y) { 25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int x = 0; x < kSubImageWidth; ++x) { 25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels.get()[kSubImageWidth * y + x] = x | (y << 16); 25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->TexSubImage2D( 25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_TEXTURE_2D, 0, kSubImageXOffset, kSubImageYOffset, kSubImageWidth, 25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSubImageHeight, GL_RGBA, GL_UNSIGNED_BYTE, pixels.get()); 25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); 25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(CheckRect( 25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSubImageWidth, 2, kFormat, kType, kPixelStoreUnpackAlignment, true, 25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<uint8*>(pixels.get() + 2 * kSubImageWidth), 25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mem2.ptr)); 25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, SubImageUnpack) { 25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLint unpack_alignments[] = { 1, 2, 4, 8 }; 25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLenum kFormat = GL_RGB; 25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLenum kType = GL_UNSIGNED_BYTE; 25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLint kLevel = 0; 25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLint kBorder = 0; 25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We're testing using the unpack params to pull a subimage out of a larger 25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // source of pixels. Here we specify the subimage by its border rows / 25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // columns. 25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLint kSrcWidth = 33; 25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLint kSrcSubImageX0 = 11; 25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLint kSrcSubImageX1 = 20; 25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLint kSrcSubImageY0 = 18; 25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLint kSrcSubImageY1 = 23; 25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLint kSrcSubImageWidth = kSrcSubImageX1 - kSrcSubImageX0; 25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLint kSrcSubImageHeight = kSrcSubImageY1 - kSrcSubImageY0; 25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // these are only used in the texsubimage tests 25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLint kTexWidth = 1023; 25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLint kTexHeight = 511; 25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLint kTexSubXOffset = 419; 25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLint kTexSubYOffset = 103; 25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct { 25422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::PixelStorei pixel_store_i; 25432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::PixelStorei pixel_store_i2; 25442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::TexImage2D tex_image_2d; 25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } texImageExpected; 25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct { 25482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::PixelStorei pixel_store_i; 25492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::PixelStorei pixel_store_i2; 25502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::TexImage2D tex_image_2d; 25512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::TexSubImage2D tex_sub_image_2d; 25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } texSubImageExpected; 25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 src_size; 25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(GLES2Util::ComputeImageDataSizes( 25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSrcWidth, kSrcSubImageY1, kFormat, kType, 8, &src_size, NULL, NULL)); 2557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<uint8[]> src_pixels; 25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) src_pixels.reset(new uint8[src_size]); 25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < src_size; ++i) { 25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) src_pixels[i] = static_cast<int8>(i); 25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int sub = 0; sub < 2; ++sub) { 25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int flip_y = 0; flip_y < 2; ++flip_y) { 25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t a = 0; a < arraysize(unpack_alignments); ++a) { 25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLint alignment = unpack_alignments[a]; 25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 size; 25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 unpadded_row_size; 25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 padded_row_size; 25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(GLES2Util::ComputeImageDataSizes( 25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSrcSubImageWidth, kSrcSubImageHeight, kFormat, kType, alignment, 25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &size, &unpadded_row_size, &padded_row_size)); 25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(size <= MaxTransferBufferSize()); 25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem = GetExpectedMemory(size); 25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void* commands = GetPut(); 25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->PixelStorei(GL_UNPACK_ALIGNMENT, alignment); 25785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gl_->PixelStorei(GL_UNPACK_ROW_LENGTH_EXT, kSrcWidth); 25795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gl_->PixelStorei(GL_UNPACK_SKIP_PIXELS_EXT, kSrcSubImageX0); 25805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gl_->PixelStorei(GL_UNPACK_SKIP_ROWS_EXT, kSrcSubImageY0); 25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->PixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, flip_y); 25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sub) { 25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->TexImage2D( 25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_TEXTURE_2D, kLevel, kFormat, kTexWidth, kTexHeight, kBorder, 25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kFormat, kType, NULL); 25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->TexSubImage2D( 25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_TEXTURE_2D, kLevel, kTexSubXOffset, kTexSubYOffset, 25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSrcSubImageWidth, kSrcSubImageHeight, kFormat, kType, 25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) src_pixels.get()); 25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) texSubImageExpected.pixel_store_i.Init( 25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_UNPACK_ALIGNMENT, alignment); 25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) texSubImageExpected.pixel_store_i2.Init( 25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_UNPACK_FLIP_Y_CHROMIUM, flip_y); 25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) texSubImageExpected.tex_image_2d.Init( 2595cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GL_TEXTURE_2D, kLevel, kFormat, kTexWidth, kTexHeight, 25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kFormat, kType, 0, 0); 25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) texSubImageExpected.tex_sub_image_2d.Init( 25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_TEXTURE_2D, kLevel, kTexSubXOffset, kTexSubYOffset, 25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSrcSubImageWidth, kSrcSubImageHeight, kFormat, kType, mem.id, 26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mem.offset, GL_FALSE); 26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp( 26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &texSubImageExpected, commands, sizeof(texSubImageExpected))); 26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->TexImage2D( 26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_TEXTURE_2D, kLevel, kFormat, 26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSrcSubImageWidth, kSrcSubImageHeight, kBorder, kFormat, kType, 26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) src_pixels.get()); 26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) texImageExpected.pixel_store_i.Init(GL_UNPACK_ALIGNMENT, alignment); 26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) texImageExpected.pixel_store_i2.Init( 26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_UNPACK_FLIP_Y_CHROMIUM, flip_y); 26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) texImageExpected.tex_image_2d.Init( 26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_TEXTURE_2D, kLevel, kFormat, kSrcSubImageWidth, 2613cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kSrcSubImageHeight, kFormat, kType, mem.id, mem.offset); 26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp( 26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &texImageExpected, commands, sizeof(texImageExpected))); 26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 src_padded_row_size; 26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(GLES2Util::ComputeImagePaddedRowSize( 26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSrcWidth, kFormat, kType, alignment, &src_padded_row_size)); 26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 bytes_per_group = GLES2Util::ComputeImageGroupSize( 26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kFormat, kType); 26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int y = 0; y < kSrcSubImageHeight; ++y) { 26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLint src_sub_y = flip_y ? kSrcSubImageHeight - y - 1 : y; 26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8* src_row = src_pixels.get() + 26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (kSrcSubImageY0 + src_sub_y) * src_padded_row_size + 26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bytes_per_group * kSrcSubImageX0; 26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8* dst_row = mem.ptr + y * padded_row_size; 26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(src_row, dst_row, unpadded_row_size)); 26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearCommands(); 26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2636cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Test texture related calls with invalid arguments. 2637cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(GLES2ImplementationTest, TextureInvalidArguments) { 2638cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) struct Cmds { 2639cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cmds::TexImage2D tex_image_2d; 2640cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cmd::SetToken set_token; 2641cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) }; 2642cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GLenum kTarget = GL_TEXTURE_2D; 2643cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GLint kLevel = 0; 2644cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GLenum kFormat = GL_RGB; 2645cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GLsizei kWidth = 3; 2646cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GLsizei kHeight = 4; 2647cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GLint kBorder = 0; 2648cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GLint kInvalidBorder = 1; 2649cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GLenum kType = GL_UNSIGNED_BYTE; 2650cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GLint kPixelStoreUnpackAlignment = 4; 2651cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static uint8 pixels[] = { 2652cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 11, 12, 13, 13, 14, 15, 15, 16, 17, 101, 102, 103, 2653cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 21, 22, 23, 23, 24, 25, 25, 26, 27, 201, 202, 203, 2654cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 31, 32, 33, 33, 34, 35, 35, 36, 37, 123, 124, 125, 2655cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 41, 42, 43, 43, 44, 45, 45, 46, 47, 2656cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) }; 2657cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2658cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Verify that something works. 2659cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2660cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ExpectedMemoryInfo mem1 = GetExpectedMemory(sizeof(pixels)); 2661cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2662cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Cmds expected; 2663cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) expected.tex_image_2d.Init( 2664cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kTarget, kLevel, kFormat, kWidth, kHeight, kFormat, kType, 2665cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) mem1.id, mem1.offset); 2666cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) expected.set_token.Init(GetNextToken()); 2667cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gl_->TexImage2D( 2668cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kTarget, kLevel, kFormat, kWidth, kHeight, kBorder, kFormat, kType, 2669cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pixels); 2670cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); 2671cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(CheckRect( 2672cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kWidth, kHeight, kFormat, kType, kPixelStoreUnpackAlignment, false, 2673cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pixels, mem1.ptr)); 2674cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2675cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ClearCommands(); 2676cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2677cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Use invalid border. 2678cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gl_->TexImage2D( 2679cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kTarget, kLevel, kFormat, kWidth, kHeight, kInvalidBorder, kFormat, kType, 2680cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pixels); 2681cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2682cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(NoCommandsWritten()); 2683cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GL_INVALID_VALUE, CheckError()); 2684cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2685cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ClearCommands(); 2686cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2687cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gl_->AsyncTexImage2DCHROMIUM( 2688cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kTarget, kLevel, kFormat, kWidth, kHeight, kInvalidBorder, kFormat, kType, 2689cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NULL); 2690cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2691cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(NoCommandsWritten()); 2692cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GL_INVALID_VALUE, CheckError()); 2693cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2694cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ClearCommands(); 2695cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2696cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Checking for CompressedTexImage2D argument validation is a bit tricky due 2697cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // to (runtime-detected) compression formats. Try to infer the error with an 2698cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // aux check. 2699cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GLenum kCompressedFormat = GL_ETC1_RGB8_OES; 2700cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gl_->CompressedTexImage2D( 2701cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kTarget, kLevel, kCompressedFormat, kWidth, kHeight, kBorder, 2702cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) arraysize(pixels), pixels); 2703cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2704cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // In the above, kCompressedFormat and arraysize(pixels) are possibly wrong 2705cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // values. First ensure that these do not cause failures at the client. If 2706cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // this check ever fails, it probably means that client checks more than at 2707cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // the time of writing of this test. In this case, more code needs to be 2708cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // written for this test. 2709cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(NoCommandsWritten()); 2710cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2711cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ClearCommands(); 2712cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2713cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Changing border to invalid border should make the call fail at the client 2714cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // checks. 2715cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gl_->CompressedTexImage2D( 2716cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kTarget, kLevel, kCompressedFormat, kWidth, kHeight, kInvalidBorder, 2717cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) arraysize(pixels), pixels); 2718cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(NoCommandsWritten()); 2719cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GL_INVALID_VALUE, CheckError()); 2720cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2721cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2722cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Binds can not be cached with bind_generates_resource = false because 27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// our id might not be valid. More specifically if you bind on contextA then 27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// delete on contextB the resource is still bound on contextA but GetInterger 27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// won't return an id. 27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationStrictSharedTest, BindsNotCached) { 27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct PNameValue { 27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLenum pname; 27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLint expected; 27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 27324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const PNameValue pairs[] = {{GL_TEXTURE_BINDING_2D, 1, }, 27334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {GL_TEXTURE_BINDING_CUBE_MAP, 2, }, 27344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {GL_TEXTURE_BINDING_EXTERNAL_OES, 3, }, 27354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {GL_FRAMEBUFFER_BINDING, 4, }, 27364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {GL_RENDERBUFFER_BINDING, 5, }, 27374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {GL_ARRAY_BUFFER_BINDING, 6, }, 27384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {GL_ELEMENT_ARRAY_BUFFER_BINDING, 7, }, }; 27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t num_pairs = sizeof(pairs) / sizeof(pairs[0]); 27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t ii = 0; ii < num_pairs; ++ii) { 27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PNameValue& pv = pairs[ii]; 27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLint v = -1; 27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo result1 = 27442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetExpectedResultMemory(sizeof(cmds::GetIntegerv::Result)); 27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*command_buffer(), OnFlush()) 27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetMemory(result1.ptr, 27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SizedResultHelper<GLuint>(pv.expected))) 27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->GetIntegerv(pv.pname, &v); 27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(pv.expected, v); 27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2754a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// glGen* Ids must not be reused until glDelete* commands have been 2755a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// flushed by glFlush. 2756a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(GLES2ImplementationStrictSharedTest, FlushGenerationTestBuffers) { 2757a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FlushGenerationTest<GenBuffersAPI>(); 2758a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 2759a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(GLES2ImplementationStrictSharedTest, FlushGenerationTestFramebuffers) { 2760a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FlushGenerationTest<GenFramebuffersAPI>(); 2761a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 2762a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(GLES2ImplementationStrictSharedTest, FlushGenerationTestRenderbuffers) { 2763a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FlushGenerationTest<GenRenderbuffersAPI>(); 2764a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 2765a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(GLES2ImplementationStrictSharedTest, FlushGenerationTestTextures) { 2766a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FlushGenerationTest<GenTexturesAPI>(); 2767a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 2768a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2769a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// glGen* Ids must not be reused cross-context until glDelete* commands are 2770a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// flushed by glFlush, and the Ids are lazily freed after. 2771a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(GLES2ImplementationStrictSharedTest, CrossContextGenerationTestBuffers) { 2772a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CrossContextGenerationTest<GenBuffersAPI>(); 2773a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 2774a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(GLES2ImplementationStrictSharedTest, 2775a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CrossContextGenerationTestFramebuffers) { 2776a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CrossContextGenerationTest<GenFramebuffersAPI>(); 2777a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 2778a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(GLES2ImplementationStrictSharedTest, 2779a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CrossContextGenerationTestRenderbuffers) { 2780a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CrossContextGenerationTest<GenRenderbuffersAPI>(); 2781a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 2782a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(GLES2ImplementationStrictSharedTest, 2783a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CrossContextGenerationTestTextures) { 2784a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CrossContextGenerationTest<GenTexturesAPI>(); 2785a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 2786a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2787a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Test Delete which causes auto flush. Tests a regression case that occurred 2788a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// in testing. 2789a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(GLES2ImplementationStrictSharedTest, 2790a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CrossContextGenerationAutoFlushTestBuffers) { 2791a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CrossContextGenerationAutoFlushTest<GenBuffersAPI>(); 2792a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 2793a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(GLES2ImplementationStrictSharedTest, 2794a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CrossContextGenerationAutoFlushTestFramebuffers) { 2795a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CrossContextGenerationAutoFlushTest<GenFramebuffersAPI>(); 2796a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 2797a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(GLES2ImplementationStrictSharedTest, 2798a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CrossContextGenerationAutoFlushTestRenderbuffers) { 2799a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CrossContextGenerationAutoFlushTest<GenRenderbuffersAPI>(); 2800a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 2801a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(GLES2ImplementationStrictSharedTest, 2802a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CrossContextGenerationAutoFlushTestTextures) { 2803a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CrossContextGenerationAutoFlushTest<GenTexturesAPI>(); 2804a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 2805a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, GetString) { 28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kBucketId = GLES2Implementation::kResultBucketId; 28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Str7 kString = {"foobar"}; 28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GL_CHROMIUM_map_sub GL_CHROMIUM_flipy are hard coded into 28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GLES2Implementation. 28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* expected_str = 28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "foobar " 28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "GL_CHROMIUM_flipy " 2814010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "GL_EXT_unpack_subimage " 2815010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "GL_CHROMIUM_map_sub"; 28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kBad = 0x12; 28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct Cmds { 28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetBucketSize set_bucket_size1; 28192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::GetString get_string; 28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::GetBucketStart get_bucket_start; 28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetToken set_token1; 28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetBucketSize set_bucket_size2; 28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem1 = GetExpectedMemory(MaxTransferBufferSize()); 28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo result1 = 28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetExpectedResultMemory(sizeof(cmd::GetBucketStart::Result)); 28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Cmds expected; 28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_bucket_size1.Init(kBucketId, 0); 28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.get_string.Init(GL_EXTENSIONS, kBucketId); 28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.get_bucket_start.Init( 28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kBucketId, result1.id, result1.offset, 28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MaxTransferBufferSize(), mem1.id, mem1.offset); 28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_token1.Init(GetNextToken()); 28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_bucket_size2.Init(kBucketId, 0); 28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char buf[sizeof(kString) + 1]; 28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(buf, kBad, sizeof(buf)); 28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*command_buffer(), OnFlush()) 28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(DoAll(SetMemory(result1.ptr, uint32(sizeof(kString))), 28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMemory(mem1.ptr, kString))) 28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLubyte* result = gl_->GetString(GL_EXTENSIONS); 28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); 28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ(expected_str, reinterpret_cast<const char*>(result)); 28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, PixelStoreiGLPackReverseRowOrderANGLE) { 28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kBucketId = GLES2Implementation::kResultBucketId; 28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Str7 kString = {"foobar"}; 28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct Cmds { 28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetBucketSize set_bucket_size1; 28532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::GetString get_string; 28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::GetBucketStart get_bucket_start; 28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetToken set_token1; 28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetBucketSize set_bucket_size2; 28572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::PixelStorei pixel_store; 28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem1 = GetExpectedMemory(MaxTransferBufferSize()); 28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo result1 = 28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetExpectedResultMemory(sizeof(cmd::GetBucketStart::Result)); 28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Cmds expected; 28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_bucket_size1.Init(kBucketId, 0); 28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.get_string.Init(GL_EXTENSIONS, kBucketId); 28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.get_bucket_start.Init( 28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kBucketId, result1.id, result1.offset, 28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MaxTransferBufferSize(), mem1.id, mem1.offset); 28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_token1.Init(GetNextToken()); 28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_bucket_size2.Init(kBucketId, 0); 28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.pixel_store.Init(GL_PACK_REVERSE_ROW_ORDER_ANGLE, 1); 28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*command_buffer(), OnFlush()) 28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(DoAll(SetMemory(result1.ptr, uint32(sizeof(kString))), 28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMemory(mem1.ptr, kString))) 28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->PixelStorei(GL_PACK_REVERSE_ROW_ORDER_ANGLE, 1); 28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); 28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, CreateProgram) { 28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct Cmds { 28852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::CreateProgram cmd; 28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Cmds expected; 28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.cmd.Init(kProgramsAndShadersStartId); 28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint id = gl_->CreateProgram(); 28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); 28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kProgramsAndShadersStartId, id); 28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, BufferDataLargerThanTransferBuffer) { 28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct Cmds { 28972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BufferData set_size; 28982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BufferSubData copy_data1; 28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetToken set_token1; 29002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BufferSubData copy_data2; 29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetToken set_token2; 29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const unsigned kUsableSize = 29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTransferBufferSize - GLES2Implementation::kStartingOffset; 29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 buf[kUsableSize * 2] = { 0, }; 29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem1 = GetExpectedMemory(kUsableSize); 29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectedMemoryInfo mem2 = GetExpectedMemory(kUsableSize); 29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Cmds expected; 29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_size.Init( 29125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_ARRAY_BUFFER, arraysize(buf), 0, 0, GL_DYNAMIC_DRAW); 29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.copy_data1.Init( 29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_ARRAY_BUFFER, 0, kUsableSize, mem1.id, mem1.offset); 29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_token1.Init(GetNextToken()); 29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.copy_data2.Init( 29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_ARRAY_BUFFER, kUsableSize, kUsableSize, mem2.id, mem2.offset); 29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_token2.Init(GetNextToken()); 29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->BufferData(GL_ARRAY_BUFFER, arraysize(buf), buf, GL_DYNAMIC_DRAW); 29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); 29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, CapabilitiesAreCached) { 29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLenum kStates[] = { 29255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_DITHER, 29265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_BLEND, 29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_CULL_FACE, 29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_DEPTH_TEST, 29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_POLYGON_OFFSET_FILL, 29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_SAMPLE_ALPHA_TO_COVERAGE, 29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_SAMPLE_COVERAGE, 29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_SCISSOR_TEST, 29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_STENCIL_TEST, 29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct Cmds { 29362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::Enable enable_cmd; 29375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 29385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Cmds expected; 29395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t ii = 0; ii < arraysize(kStates); ++ii) { 29415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLenum state = kStates[ii]; 29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.enable_cmd.Init(state); 29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLboolean result = gl_->IsEnabled(state); 29442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(static_cast<GLboolean>(ii == 0), result); 29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NoCommandsWritten()); 29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void* commands = GetPut(); 29472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!result) { 29482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_->Enable(state); 29492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, memcmp(&expected, commands, sizeof(expected))); 29502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 29515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearCommands(); 29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = gl_->IsEnabled(state); 29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(result); 29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NoCommandsWritten()); 29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(GLES2ImplementationTest, BindVertexArrayOES) { 29592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLuint id = 0; 29602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_->GenVertexArraysOES(1, &id); 29612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ClearCommands(); 29622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct Cmds { 29642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BindVertexArrayOES cmd; 29652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 29662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Cmds expected; 29672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected.cmd.Init(id); 29682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const void* commands = GetPut(); 29702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_->BindVertexArrayOES(id); 29712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, memcmp(&expected, commands, sizeof(expected))); 29722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ClearCommands(); 29732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_->BindVertexArrayOES(id); 29742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(NoCommandsWritten()); 29752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 29762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, BeginEndQueryEXT) { 29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test GetQueryivEXT returns 0 if no current query. 29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLint param = -1; 29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->GetQueryivEXT(GL_ANY_SAMPLES_PASSED_EXT, GL_CURRENT_QUERY_EXT, ¶m); 29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, param); 29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint expected_ids[2] = { 1, 2 }; // These must match what's actually genned. 29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct GenCmds { 29852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::GenQueriesEXTImmediate gen; 29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint data[2]; 29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GenCmds expected_gen_cmds; 29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_gen_cmds.gen.Init(arraysize(expected_ids), &expected_ids[0]); 29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint ids[arraysize(expected_ids)] = { 0, }; 29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->GenQueriesEXT(arraysize(expected_ids), &ids[0]); 29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp( 29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &expected_gen_cmds, commands_, sizeof(expected_gen_cmds))); 29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint id1 = ids[0]; 29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint id2 = ids[1]; 29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearCommands(); 29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test BeginQueryEXT fails if id = 0. 29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->BeginQueryEXT(GL_ANY_SAMPLES_PASSED_EXT, 0); 30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NoCommandsWritten()); 30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GL_INVALID_OPERATION, CheckError()); 30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test BeginQueryEXT inserts command. 30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct BeginCmds { 30052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BeginQueryEXT begin_query; 30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BeginCmds expected_begin_cmds; 30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void* commands = GetPut(); 30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->BeginQueryEXT(GL_ANY_SAMPLES_PASSED_EXT, id1); 30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueryTracker::Query* query = GetQuery(id1); 30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(query != NULL); 30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_begin_cmds.begin_query.Init( 30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_ANY_SAMPLES_PASSED_EXT, id1, query->shm_id(), query->shm_offset()); 30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp( 30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &expected_begin_cmds, commands, sizeof(expected_begin_cmds))); 30165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearCommands(); 30175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test GetQueryivEXT returns id. 30195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) param = -1; 30205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->GetQueryivEXT(GL_ANY_SAMPLES_PASSED_EXT, GL_CURRENT_QUERY_EXT, ¶m); 30215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(id1, static_cast<GLuint>(param)); 30225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->GetQueryivEXT( 30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT, GL_CURRENT_QUERY_EXT, ¶m); 30245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, param); 30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test BeginQueryEXT fails if between Begin/End. 30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->BeginQueryEXT(GL_ANY_SAMPLES_PASSED_EXT, id2); 30285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NoCommandsWritten()); 30295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GL_INVALID_OPERATION, CheckError()); 30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test EndQueryEXT fails if target not same as current query. 30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearCommands(); 30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->EndQueryEXT(GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT); 30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NoCommandsWritten()); 30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GL_INVALID_OPERATION, CheckError()); 30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test EndQueryEXT sends command 30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct EndCmds { 30392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::EndQueryEXT end_query; 30405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EndCmds expected_end_cmds; 30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_end_cmds.end_query.Init( 30435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_ANY_SAMPLES_PASSED_EXT, query->submit_count()); 30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) commands = GetPut(); 30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->EndQueryEXT(GL_ANY_SAMPLES_PASSED_EXT); 30465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp( 30475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &expected_end_cmds, commands, sizeof(expected_end_cmds))); 30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test EndQueryEXT fails if no current query. 30505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearCommands(); 30515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->EndQueryEXT(GL_ANY_SAMPLES_PASSED_EXT); 30525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NoCommandsWritten()); 30535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GL_INVALID_OPERATION, CheckError()); 30545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test 2nd Begin/End increments count. 3056a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::subtle::Atomic32 old_submit_count = query->submit_count(); 30575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->BeginQueryEXT(GL_ANY_SAMPLES_PASSED_EXT, id1); 30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(old_submit_count, query->submit_count()); 30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_end_cmds.end_query.Init( 30605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_ANY_SAMPLES_PASSED_EXT, query->submit_count()); 30615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) commands = GetPut(); 30625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->EndQueryEXT(GL_ANY_SAMPLES_PASSED_EXT); 30635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp( 30645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &expected_end_cmds, commands, sizeof(expected_end_cmds))); 30655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test BeginQueryEXT fails if target changed. 30675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearCommands(); 30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->BeginQueryEXT(GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT, id1); 30695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NoCommandsWritten()); 30705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GL_INVALID_OPERATION, CheckError()); 30715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test GetQueryObjectuivEXT fails if unused id 30735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint available = 0xBDu; 30745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearCommands(); 30755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->GetQueryObjectuivEXT(id2, GL_QUERY_RESULT_AVAILABLE_EXT, &available); 30765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NoCommandsWritten()); 30775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0xBDu, available); 30785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GL_INVALID_OPERATION, CheckError()); 30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test GetQueryObjectuivEXT fails if bad id 30815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearCommands(); 30825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->GetQueryObjectuivEXT(4567, GL_QUERY_RESULT_AVAILABLE_EXT, &available); 30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NoCommandsWritten()); 30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0xBDu, available); 30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GL_INVALID_OPERATION, CheckError()); 30865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test GetQueryObjectuivEXT CheckResultsAvailable 30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearCommands(); 30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->GetQueryObjectuivEXT(id1, GL_QUERY_RESULT_AVAILABLE_EXT, &available); 30905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, available); 30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, ErrorQuery) { 30945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint id = 0; 30955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->GenQueriesEXT(1, &id); 30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearCommands(); 30975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test BeginQueryEXT does NOT insert commands. 30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->BeginQueryEXT(GL_GET_ERROR_QUERY_CHROMIUM, id); 31005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NoCommandsWritten()); 31015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueryTracker::Query* query = GetQuery(id); 31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(query != NULL); 31035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test EndQueryEXT sends both begin and end command 31055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct EndCmds { 31062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::BeginQueryEXT begin_query; 31072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::EndQueryEXT end_query; 31085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 31095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EndCmds expected_end_cmds; 31105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_end_cmds.begin_query.Init( 31115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_GET_ERROR_QUERY_CHROMIUM, id, query->shm_id(), query->shm_offset()); 31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_end_cmds.end_query.Init( 31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_GET_ERROR_QUERY_CHROMIUM, query->submit_count()); 31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void* commands = GetPut(); 31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->EndQueryEXT(GL_GET_ERROR_QUERY_CHROMIUM); 31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp( 31175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &expected_end_cmds, commands, sizeof(expected_end_cmds))); 31185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearCommands(); 31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check result is not yet available. 31215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint available = 0xBDu; 31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->GetQueryObjectuivEXT(id, GL_QUERY_RESULT_AVAILABLE_EXT, &available); 31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NoCommandsWritten()); 31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, available); 31255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test no commands are sent if there is a client side error. 31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Generate a client side error 31295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->ActiveTexture(GL_TEXTURE0 - 1); 31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->BeginQueryEXT(GL_GET_ERROR_QUERY_CHROMIUM, id); 31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->EndQueryEXT(GL_GET_ERROR_QUERY_CHROMIUM); 31335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NoCommandsWritten()); 31345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check result is available. 31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->GetQueryObjectuivEXT(id, GL_QUERY_RESULT_AVAILABLE_EXT, &available); 31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NoCommandsWritten()); 31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0u, available); 31395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check result. 31415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint result = 0xBDu; 31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->GetQueryObjectuivEXT(id, GL_QUERY_RESULT_EXT, &result); 31435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NoCommandsWritten()); 31445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<GLuint>(GL_INVALID_ENUM), result); 31455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) 31485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, VertexArrays) { 31495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kAttribIndex1 = 1; 31505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint kNumComponents1 = 3; 31515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLsizei kClientStride = 12; 31525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint id = 0; 31545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->GenVertexArraysOES(1, &id); 31555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearCommands(); 31565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->BindVertexArrayOES(id); 31585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test that VertexAttribPointer cannot be called with a bound buffer of 0 31605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // unless the offset is NULL 31615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->BindBuffer(GL_ARRAY_BUFFER, 0); 31625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->VertexAttribPointer( 31645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kAttribIndex1, kNumComponents1, GL_FLOAT, GL_FALSE, kClientStride, 31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<const void*>(4)); 31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GL_INVALID_OPERATION, CheckError()); 31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_->VertexAttribPointer( 31695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kAttribIndex1, kNumComponents1, GL_FLOAT, GL_FALSE, kClientStride, NULL); 31705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GL_NO_ERROR, CheckError()); 31715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 31735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(GLES2ImplementationTest, Disable) { 31752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct Cmds { 31762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::Disable cmd; 31772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 31782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Cmds expected; 31792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected.cmd.Init(GL_DITHER); // Note: DITHER defaults to enabled. 31802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_->Disable(GL_DITHER); 31822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); 31832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check it's cached and not called again. 31842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ClearCommands(); 31852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_->Disable(GL_DITHER); 31862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(NoCommandsWritten()); 31872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 31882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(GLES2ImplementationTest, Enable) { 31902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct Cmds { 31912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmds::Enable cmd; 31922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 31932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Cmds expected; 31942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected.cmd.Init(GL_BLEND); // Note: BLEND defaults to disabled. 31952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_->Enable(GL_BLEND); 31972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); 31982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check it's cached and not called again. 31992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ClearCommands(); 32002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_->Enable(GL_BLEND); 32012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(NoCommandsWritten()); 32022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 32032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 32045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(GLES2ImplementationTest, ConsumeTextureCHROMIUM) { 32055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) struct Cmds { 32065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) cmds::ConsumeTextureCHROMIUMImmediate cmd; 32075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GLbyte data[64]; 32085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 32095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Mailbox mailbox = Mailbox::Generate(); 32115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Cmds expected; 32125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected.cmd.Init(GL_TEXTURE_2D, mailbox.name); 32135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gl_->ConsumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name); 32145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); 32155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 32165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3217f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(GLES2ImplementationTest, CreateAndConsumeTextureCHROMIUM) { 3218f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) struct Cmds { 3219f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) cmds::CreateAndConsumeTextureCHROMIUMImmediate cmd; 3220f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GLbyte data[64]; 3221f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) }; 3222f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 3223f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Mailbox mailbox = Mailbox::Generate(); 3224f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Cmds expected; 3225f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) expected.cmd.Init(GL_TEXTURE_2D, kTexturesStartId, mailbox.name); 3226f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GLuint id = gl_->CreateAndConsumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name); 3227f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); 3228f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(kTexturesStartId, id); 3229f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 3230f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 32315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(GLES2ImplementationTest, ProduceTextureCHROMIUM) { 32325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) struct Cmds { 32335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) cmds::ProduceTextureCHROMIUMImmediate cmd; 32345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GLbyte data[64]; 32355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 32365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Mailbox mailbox = Mailbox::Generate(); 32385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Cmds expected; 32395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected.cmd.Init(GL_TEXTURE_2D, mailbox.name); 32405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gl_->ProduceTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name); 32415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); 32425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 32432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3244f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(GLES2ImplementationTest, ProduceTextureDirectCHROMIUM) { 3245f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) struct Cmds { 3246f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) cmds::ProduceTextureDirectCHROMIUMImmediate cmd; 3247f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GLbyte data[64]; 3248f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) }; 3249f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 3250f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Mailbox mailbox = Mailbox::Generate(); 3251f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Cmds expected; 3252f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) expected.cmd.Init(kTexturesStartId, GL_TEXTURE_2D, mailbox.name); 3253f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) gl_->ProduceTextureDirectCHROMIUM( 3254f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kTexturesStartId, GL_TEXTURE_2D, mailbox.name); 3255f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); 3256f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 3257f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 32585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(GLES2ImplementationTest, LimitSizeAndOffsetTo32Bit) { 32595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GLsizeiptr size; 32605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GLintptr offset; 32615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (sizeof(size) <= 4 || sizeof(offset) <= 4) 32625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return; 32635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // The below two casts should be no-op, as we return early if 32645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // it's 32-bit system. 32655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu int64 value64 = 0x100000000; 32665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu size = static_cast<GLsizeiptr>(value64); 32675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu offset = static_cast<GLintptr>(value64); 32685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 32695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const char kSizeOverflowMessage[] = "size more than 32-bit"; 32705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const char kOffsetOverflowMessage[] = "offset more than 32-bit"; 32715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 32725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const GLfloat buf[] = { 1.0, 1.0, 1.0, 1.0 }; 32735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const GLubyte indices[] = { 0 }; 32745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 32755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const GLuint kClientArrayBufferId = 0x789; 32765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const GLuint kClientElementArrayBufferId = 0x790; 32775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu gl_->BindBuffer(GL_ARRAY_BUFFER, kClientArrayBufferId); 32785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu gl_->BindBuffer(GL_ELEMENT_ARRAY_BUFFER, kClientElementArrayBufferId); 32795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(GL_NO_ERROR, CheckError()); 32805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 32815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Call BufferData() should succeed with legal paramaters. 32825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu gl_->BufferData(GL_ARRAY_BUFFER, sizeof(buf), buf, GL_DYNAMIC_DRAW); 32835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu gl_->BufferData( 32845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_DYNAMIC_DRAW); 32855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(GL_NO_ERROR, CheckError()); 32865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 32875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // BufferData: size 32885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu gl_->BufferData(GL_ARRAY_BUFFER, size, buf, GL_DYNAMIC_DRAW); 32895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(GL_INVALID_OPERATION, CheckError()); 32905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_STREQ(kSizeOverflowMessage, GetLastError().c_str()); 32915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 32925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Call BufferSubData() should succeed with legal paramaters. 32935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu gl_->BufferSubData(GL_ARRAY_BUFFER, 0, sizeof(buf[0]), buf); 32945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(GL_NO_ERROR, CheckError()); 32955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 32965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // BufferSubData: offset 32975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu gl_->BufferSubData(GL_ARRAY_BUFFER, offset, 1, buf); 32985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(GL_INVALID_OPERATION, CheckError()); 32995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_STREQ(kOffsetOverflowMessage, GetLastError().c_str()); 33005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 33015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // BufferSubData: size 33025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(GL_NO_ERROR, CheckError()); 33035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu gl_->BufferSubData(GL_ARRAY_BUFFER, 0, size, buf); 33045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(GL_INVALID_OPERATION, CheckError()); 33055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_STREQ(kSizeOverflowMessage, GetLastError().c_str()); 33065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 33075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Call MapBufferSubDataCHROMIUM() should succeed with legal paramaters. 3308cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void* mem = 3309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gl_->MapBufferSubDataCHROMIUM(GL_ARRAY_BUFFER, 0, 1, GL_WRITE_ONLY); 3310cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(NULL != mem); 33115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(GL_NO_ERROR, CheckError()); 3312cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gl_->UnmapBufferSubDataCHROMIUM(mem); 33135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 33145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // MapBufferSubDataCHROMIUM: offset 33155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(NULL == gl_->MapBufferSubDataCHROMIUM( 33165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GL_ARRAY_BUFFER, offset, 1, GL_WRITE_ONLY)); 33175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(GL_INVALID_OPERATION, CheckError()); 33185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_STREQ(kOffsetOverflowMessage, GetLastError().c_str()); 33195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 33205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // MapBufferSubDataCHROMIUM: size 33215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(GL_NO_ERROR, CheckError()); 33225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(NULL == gl_->MapBufferSubDataCHROMIUM( 33235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GL_ARRAY_BUFFER, 0, size, GL_WRITE_ONLY)); 33245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(GL_INVALID_OPERATION, CheckError()); 33255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_STREQ(kSizeOverflowMessage, GetLastError().c_str()); 33265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 33275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Call DrawElements() should succeed with legal paramaters. 33285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu gl_->DrawElements(GL_POINTS, 1, GL_UNSIGNED_BYTE, NULL); 33295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(GL_NO_ERROR, CheckError()); 33305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 33315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // DrawElements: offset 33325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu gl_->DrawElements( 33335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GL_POINTS, 1, GL_UNSIGNED_BYTE, reinterpret_cast<void*>(offset)); 33345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(GL_INVALID_OPERATION, CheckError()); 33355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_STREQ(kOffsetOverflowMessage, GetLastError().c_str()); 33365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 33375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Call DrawElementsInstancedANGLE() should succeed with legal paramaters. 33385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu gl_->DrawElementsInstancedANGLE(GL_POINTS, 1, GL_UNSIGNED_BYTE, NULL, 1); 33395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(GL_NO_ERROR, CheckError()); 33405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 33415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // DrawElementsInstancedANGLE: offset 33425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu gl_->DrawElementsInstancedANGLE( 33435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GL_POINTS, 1, GL_UNSIGNED_BYTE, reinterpret_cast<void*>(offset), 1); 33445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(GL_INVALID_OPERATION, CheckError()); 33455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_STREQ(kOffsetOverflowMessage, GetLastError().c_str()); 33465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 33475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Call VertexAttribPointer() should succeed with legal paramaters. 33485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const GLuint kAttribIndex = 1; 33495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const GLsizei kStride = 4; 33505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu gl_->VertexAttribPointer( 33515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu kAttribIndex, 1, GL_FLOAT, GL_FALSE, kStride, NULL); 33525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(GL_NO_ERROR, CheckError()); 33535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 33545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // VertexAttribPointer: offset 33555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu gl_->VertexAttribPointer( 33565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu kAttribIndex, 1, GL_FLOAT, GL_FALSE, kStride, 33575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu reinterpret_cast<void*>(offset)); 33585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(GL_INVALID_OPERATION, CheckError()); 33595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_STREQ(kOffsetOverflowMessage, GetLastError().c_str()); 33605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 33615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 3362e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochTEST_F(GLES2ImplementationManualInitTest, LoseContextOnOOM) { 3363c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ContextInitOptions init_options; 3364c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch init_options.lose_context_when_out_of_memory = true; 3365c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_TRUE(Initialize(init_options)); 3366e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 3367e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch struct Cmds { 3368e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch cmds::LoseContextCHROMIUM cmd; 3369e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch }; 3370e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 3371e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch GLsizei max = std::numeric_limits<GLsizei>::max(); 3372010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*gpu_control_, CreateGpuMemoryBuffer(max, max, _, _, _)) 3373e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch .WillOnce(Return(static_cast<gfx::GpuMemoryBuffer*>(NULL))); 3374010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) gl_->CreateImageCHROMIUM(max, max, 0, GL_IMAGE_MAP_CHROMIUM); 3375e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // The context should be lost. 3376e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch Cmds expected; 3377e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch expected.cmd.Init(GL_GUILTY_CONTEXT_RESET_ARB, GL_UNKNOWN_CONTEXT_RESET_ARB); 3378e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); 3379e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 3380e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 3381e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochTEST_F(GLES2ImplementationManualInitTest, NoLoseContextOnOOM) { 3382c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ContextInitOptions init_options; 3383c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_TRUE(Initialize(init_options)); 3384e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 3385e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch struct Cmds { 3386e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch cmds::LoseContextCHROMIUM cmd; 3387e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch }; 3388e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 3389e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch GLsizei max = std::numeric_limits<GLsizei>::max(); 3390010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*gpu_control_, CreateGpuMemoryBuffer(max, max, _, _, _)) 3391e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch .WillOnce(Return(static_cast<gfx::GpuMemoryBuffer*>(NULL))); 3392010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) gl_->CreateImageCHROMIUM(max, max, 0, GL_IMAGE_MAP_CHROMIUM); 3393e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // The context should not be lost. 3394e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch EXPECT_TRUE(NoCommandsWritten()); 3395e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 3396e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 3397c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(GLES2ImplementationManualInitTest, FailInitOnBGRMismatch1) { 3398c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ContextInitOptions init_options; 3399c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch init_options.bind_generates_resource_client = false; 3400c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch init_options.bind_generates_resource_service = true; 3401c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_FALSE(Initialize(init_options)); 3402c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 3403c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 3404c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(GLES2ImplementationManualInitTest, FailInitOnBGRMismatch2) { 3405c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ContextInitOptions init_options; 3406c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch init_options.bind_generates_resource_client = true; 3407c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch init_options.bind_generates_resource_service = false; 3408c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_FALSE(Initialize(init_options)); 3409c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 3410c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 34115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/client/gles2_implementation_unittest_autogen.h" 34125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gles2 34145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gpu 3415