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, &current[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(&current_attrib, &current, 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, &param);
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, &param);
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, &param);
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