gles2_implementation_unittest.cc revision f2477e01787aa58f445919b809d89e252beef54f
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)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <GLES2/gl2ext.h>
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <GLES2/gl2extchromium.h>
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/compiler_specific.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/client/client_test_helper.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/client/program_info_manager.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/client/transfer_buffer.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/common/command_buffer.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GLES2_SUPPORT_CLIENT_SIDE_ARRAYS
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_;
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::AtLeast;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::AnyNumber;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::DoAll;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::InSequence;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Invoke;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Mock;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Sequence;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::StrictMock;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Truly;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Return;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P2(SetMemory, dst, obj) {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(dst, &obj, sizeof(obj));
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P3(SetMemoryFromArray, dst, array, size) {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(dst, array, size);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used to help set the transfer buffer result to SizedResult of a single value.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename T>
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SizedResultHelper {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit SizedResultHelper(T result)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : size_(sizeof(result)),
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        result_(result) {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 size_;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  T result_;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Struct to make it easy to pass a vec4 worth of floats.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct FourFloats {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FourFloats(float _x, float _y, float _z, float _w)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : x(_x),
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        y(_y),
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        z(_z),
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        w(_w) {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float x;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float y;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float z;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float w;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma pack(push, 1)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Struct that holds 7 characters.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Str7 {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char str[7];
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma pack(pop)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockTransferBuffer : public TransferBufferInterface {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct ExpectedMemoryInfo {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 offset;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int32 id;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint8* ptr;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockTransferBuffer(
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CommandBuffer* command_buffer,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unsigned int size,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unsigned int result_size,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unsigned int alignment)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : command_buffer_(command_buffer),
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        size_(size),
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        result_size_(result_size),
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        alignment_(alignment),
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        actual_buffer_index_(0),
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        expected_buffer_index_(0),
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        last_alloc_(NULL),
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        expected_offset_(result_size),
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        actual_offset_(result_size) {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We have to allocate the buffers here because
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // we need to know their address before GLES2Implementation::Initialize
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // is called.
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int ii = 0; ii < kNumBuffers; ++ii) {
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      buffers_[ii] = command_buffer_->CreateTransferBuffer(
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          size_ + ii * alignment_,
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          &buffer_ids_[ii]);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_NE(-1, buffer_ids_[ii]);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MockTransferBuffer() { }
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool Initialize(
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unsigned int starting_buffer_size,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unsigned int result_size,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unsigned int /* min_buffer_size */,
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unsigned int /* max_buffer_size */,
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unsigned int alignment,
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unsigned int size_to_flush) OVERRIDE;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int GetShmId() OVERRIDE;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void* GetResultBuffer() OVERRIDE;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int GetResultOffset() OVERRIDE;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Free() OVERRIDE;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool HaveBuffer() const OVERRIDE;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void* AllocUpTo(
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unsigned int size, unsigned int* size_allocated) OVERRIDE;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void* Alloc(unsigned int size) OVERRIDE;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual RingBuffer::Offset GetOffset(void* pointer) const OVERRIDE;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void FreePendingToken(void* p, unsigned int /* token */) OVERRIDE;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t MaxTransferBufferSize() {
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return size_ - result_size_;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned int RoundToAlignment(unsigned int size) {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (size + alignment_ - 1) & ~(alignment_ - 1);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool InSync() {
144a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    return expected_buffer_index_ == actual_buffer_index_ &&
145a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)           expected_offset_ == actual_offset_;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo GetExpectedMemory(size_t size) {
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectedMemoryInfo mem;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mem.offset = AllocateExpectedTransferBuffer(size);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mem.id = GetExpectedTransferBufferId();
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mem.ptr = static_cast<uint8*>(
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       GetExpectedTransferAddressFromOffset(mem.offset, size));
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return mem;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo GetExpectedResultMemory(size_t size) {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectedMemoryInfo mem;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mem.offset = GetExpectedResultBufferOffset();
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mem.id = GetExpectedResultBufferId();
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mem.ptr = static_cast<uint8*>(
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetExpectedTransferAddressFromOffset(mem.offset, size));
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return mem;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kNumBuffers = 2;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint8* actual_buffer() const {
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return static_cast<uint8*>(buffers_[actual_buffer_index_].ptr);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint8* expected_buffer() const {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return static_cast<uint8*>(buffers_[expected_buffer_index_].ptr);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 AllocateExpectedTransferBuffer(size_t size) {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_LE(size, MaxTransferBufferSize());
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Toggle which buffer we get each time to simulate the buffer being
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // reallocated.
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected_buffer_index_ = (expected_buffer_index_ + 1) % kNumBuffers;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (expected_offset_ + size > size_) {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      expected_offset_ = result_size_;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 offset = expected_offset_;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected_offset_ += RoundToAlignment(size);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure each buffer has a different offset.
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return offset + expected_buffer_index_ * alignment_;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* GetExpectedTransferAddressFromOffset(uint32 offset, size_t size) {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_GE(offset, expected_buffer_index_ * alignment_);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_LE(offset + size, size_ + expected_buffer_index_ * alignment_);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return expected_buffer() + offset;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int GetExpectedResultBufferId() {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return buffer_ids_[expected_buffer_index_];
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 GetExpectedResultBufferOffset() {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return expected_buffer_index_ * alignment_;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int GetExpectedTransferBufferId() {
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return buffer_ids_[expected_buffer_index_];
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandBuffer* command_buffer_;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t size_;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t result_size_;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 alignment_;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int buffer_ids_[kNumBuffers];
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gpu::Buffer buffers_[kNumBuffers];
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int actual_buffer_index_;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int expected_buffer_index_;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* last_alloc_;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 expected_offset_;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 actual_offset_;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockTransferBuffer);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MockTransferBuffer::Initialize(
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int starting_buffer_size,
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int result_size,
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int /* min_buffer_size */,
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int /* max_buffer_size */,
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int alignment,
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int /* size_to_flush */) {
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Just check they match.
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return size_ == starting_buffer_size &&
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         result_size_ == result_size &&
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         alignment_ == alignment;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MockTransferBuffer::GetShmId() {
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return buffer_ids_[actual_buffer_index_];
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void* MockTransferBuffer::GetResultBuffer() {
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return actual_buffer() + actual_buffer_index_ * alignment_;
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MockTransferBuffer::GetResultOffset() {
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return actual_buffer_index_ * alignment_;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockTransferBuffer::Free() {
253f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  NOTREACHED();
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MockTransferBuffer::HaveBuffer() const {
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void* MockTransferBuffer::AllocUpTo(
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int size, unsigned int* size_allocated) {
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(size_allocated != NULL);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(last_alloc_ == NULL);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Toggle which buffer we get each time to simulate the buffer being
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reallocated.
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  actual_buffer_index_ = (actual_buffer_index_ + 1) % kNumBuffers;
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size = std::min(static_cast<size_t>(size), MaxTransferBufferSize());
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (actual_offset_ + size > size_) {
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    actual_offset_ = result_size_;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 offset = actual_offset_;
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  actual_offset_ += RoundToAlignment(size);
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *size_allocated = size;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure each buffer has a different offset.
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_alloc_ = actual_buffer() + offset + actual_buffer_index_ * alignment_;
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return last_alloc_;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void* MockTransferBuffer::Alloc(unsigned int size) {
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LE(size, MaxTransferBufferSize());
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned int temp = 0;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* p = AllocUpTo(size, &temp);
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(temp, size);
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return p;
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RingBuffer::Offset MockTransferBuffer::GetOffset(void* pointer) const {
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure each buffer has a different offset.
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return static_cast<uint8*>(pointer) - actual_buffer();
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockTransferBuffer::FreePendingToken(void* p, unsigned int /* token */) {
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(last_alloc_, p);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_alloc_ = NULL;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GLES2ImplementationTest : public testing::Test {
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const uint8 kInitialValue = 0xBD;
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int32 kNumCommandEntries = 500;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int32 kCommandBufferSizeBytes =
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kNumCommandEntries * sizeof(CommandBufferEntry);
306a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  static const size_t kTransferBufferSize = 512;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kMaxCombinedTextureImageUnits = 8;
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kMaxCubeMapTextureSize = 64;
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kMaxFragmentUniformVectors = 16;
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kMaxRenderbufferSize = 64;
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kMaxTextureImageUnits = 8;
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kMaxTextureSize = 128;
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kMaxVaryingVectors = 8;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kMaxVertexAttribs = 8;
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kMaxVertexTextureImageUnits = 0;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kMaxVertexUniformVectors = 128;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kNumCompressedTextureFormats = 0;
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kNumShaderBinaryFormats = 0;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kStartId = 1024;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kBuffersStartId =
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLES2Implementation::kClientSideArrayId + 2;
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kFramebuffersStartId = 1;
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kProgramsAndShadersStartId = 1;
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kRenderbuffersStartId = 1;
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kTexturesStartId = 1;
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kQueriesStartId = 1;
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kVertexArraysStartId = 1;
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef MockTransferBuffer::ExpectedMemoryInfo ExpectedMemoryInfo;
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLES2ImplementationTest()
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : commands_(NULL),
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        token_(0) {
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE;
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE;
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool NoCommandsWritten() {
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Buffer ring_buffer = helper_->get_ring_buffer();
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const uint8* cmds = reinterpret_cast<const uint8*>(ring_buffer.ptr);
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const uint8* end = cmds + ring_buffer.size;
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (; cmds < end; ++cmds) {
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (*cmds != kInitialValue) {
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QueryTracker::Query* GetQuery(GLuint id) {
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return gl_->query_tracker_->GetQuery(id);
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
356558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  void Initialize(bool bind_generates_resource) {
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_buffer_.reset(new StrictMock<MockClientCommandBuffer>());
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(command_buffer_->Initialize());
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    transfer_buffer_.reset(new MockTransferBuffer(
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        command_buffer(),
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kTransferBufferSize,
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GLES2Implementation::kStartingOffset,
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GLES2Implementation::kAlignment));
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_.reset(new GLES2CmdHelper(command_buffer()));
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_->Initialize(kCommandBufferSizeBytes);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    gpu_control_.reset(new StrictMock<MockClientGpuControl>());
3703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GLES2Implementation::GLStaticState state;
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GLES2Implementation::GLStaticState::IntState& int_state = state.int_state;
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int_state.max_combined_texture_image_units = kMaxCombinedTextureImageUnits;
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int_state.max_cube_map_texture_size = kMaxCubeMapTextureSize;
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int_state.max_fragment_uniform_vectors = kMaxFragmentUniformVectors;
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int_state.max_renderbuffer_size = kMaxRenderbufferSize;
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int_state.max_texture_image_units = kMaxTextureImageUnits;
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int_state.max_texture_size = kMaxTextureSize;
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int_state.max_varying_vectors = kMaxVaryingVectors;
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int_state.max_vertex_attribs = kMaxVertexAttribs;
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int_state.max_vertex_texture_image_units = kMaxVertexTextureImageUnits;
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int_state.max_vertex_uniform_vectors = kMaxVertexUniformVectors;
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int_state.num_compressed_texture_formats = kNumCompressedTextureFormats;
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int_state.num_shader_binary_formats = kNumShaderBinaryFormats;
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This just happens to work for now because IntState has 1 GLint per state.
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If IntState gets more complicated this code will need to get more
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // complicated.
389a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    ExpectedMemoryInfo mem1 = GetExpectedMemory(
390a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        sizeof(GLES2Implementation::GLStaticState::IntState) * 2 +
391a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        sizeof(cmds::GetShaderPrecisionFormat::Result) * 12);
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InSequence sequence;
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(*command_buffer(), OnFlush())
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .WillOnce(SetMemory(mem1.ptr + sizeof(int_state), int_state))
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .RetiresOnSaturation();
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetNextToken();  // eat the token that starting up will use.
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gl_.reset(new GLES2Implementation(
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          helper_.get(),
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          NULL,
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          transfer_buffer_.get(),
40590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          bind_generates_resource,
4063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          gpu_control_.get()));
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_TRUE(gl_->Initialize(
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kTransferBufferSize,
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kTransferBufferSize,
4103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          kTransferBufferSize,
4113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          GLES2Implementation::kNoLimit));
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*command_buffer(), OnFlush())
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_->CommandBufferHelper::Finish();
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ::testing::Mock::VerifyAndClearExpectations(gl_.get());
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Buffer ring_buffer = helper_->get_ring_buffer();
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    commands_ = static_cast<CommandBufferEntry*>(ring_buffer.ptr) +
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                command_buffer()->GetState().put_offset;
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClearCommands();
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(transfer_buffer_->InSync());
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ::testing::Mock::VerifyAndClearExpectations(command_buffer());
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockClientCommandBuffer* command_buffer() const {
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return command_buffer_.get();
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int GetNextToken() {
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ++token_;
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const void* GetPut() {
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return helper_->GetSpace(0);
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ClearCommands() {
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Buffer ring_buffer = helper_->get_ring_buffer();
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(ring_buffer.ptr, kInitialValue, ring_buffer.size);
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t MaxTransferBufferSize() {
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return transfer_buffer_->MaxTransferBufferSize();
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo GetExpectedMemory(size_t size) {
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return transfer_buffer_->GetExpectedMemory(size);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo GetExpectedResultMemory(size_t size) {
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return transfer_buffer_->GetExpectedResultMemory(size);
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the ProgramInfoManager. The manager will be owned
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // by the ShareGroup.
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetProgramInfoManager(ProgramInfoManager* manager) {
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gl_->share_group()->set_program_info_manager(manager);
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int CheckError() {
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectedMemoryInfo result =
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        GetExpectedResultMemory(sizeof(cmds::GetError::Result));
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*command_buffer(), OnFlush())
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillOnce(SetMemory(result.ptr, GLuint(GL_NO_ERROR)))
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return gl_->GetError();
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetBucketContents(uint32 bucket_id, std::vector<int8>* data) {
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return gl_->GetBucketContents(bucket_id, data);
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Sequence sequence_;
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MockClientCommandBuffer> command_buffer_;
4793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<MockClientGpuControl> gpu_control_;
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<GLES2CmdHelper> helper_;
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MockTransferBuffer> transfer_buffer_;
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<GLES2Implementation> gl_;
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandBufferEntry* commands_;
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int token_;
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2ImplementationTest::SetUp() {
488558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  Initialize(true);
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2ImplementationTest::TearDown() {
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClear(gl_.get());
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*command_buffer(), OnFlush()).Times(AnyNumber());
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For command buffer.
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*command_buffer(), DestroyTransferBuffer(_))
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .Times(AtLeast(1));
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_.reset();
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GLES2ImplementationStrictSharedTest : public GLES2ImplementationTest {
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE;
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2ImplementationStrictSharedTest::SetUp() {
506558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  Initialize(false);
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GCC requires these declarations, but MSVC requires they not be present
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef _MSC_VER
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint8 GLES2ImplementationTest::kInitialValue;
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 GLES2ImplementationTest::kNumCommandEntries;
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 GLES2ImplementationTest::kCommandBufferSizeBytes;
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const size_t GLES2ImplementationTest::kTransferBufferSize;
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2ImplementationTest::kMaxCombinedTextureImageUnits;
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2ImplementationTest::kMaxCubeMapTextureSize;
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2ImplementationTest::kMaxFragmentUniformVectors;
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2ImplementationTest::kMaxRenderbufferSize;
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2ImplementationTest::kMaxTextureImageUnits;
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2ImplementationTest::kMaxTextureSize;
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2ImplementationTest::kMaxVaryingVectors;
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2ImplementationTest::kMaxVertexAttribs;
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2ImplementationTest::kMaxVertexTextureImageUnits;
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2ImplementationTest::kMaxVertexUniformVectors;
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2ImplementationTest::kNumCompressedTextureFormats;
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2ImplementationTest::kNumShaderBinaryFormats;
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2ImplementationTest::kStartId;
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2ImplementationTest::kBuffersStartId;
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2ImplementationTest::kFramebuffersStartId;
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2ImplementationTest::kProgramsAndShadersStartId;
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2ImplementationTest::kRenderbuffersStartId;
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2ImplementationTest::kTexturesStartId;
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2ImplementationTest::kQueriesStartId;
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2ImplementationTest::kVertexArraysStartId;
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, Basic) {
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(gl_->share_group() != NULL);
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, GetBucketContents) {
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 kBucketId = GLES2Implementation::kResultBucketId;
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 kTestSize = MaxTransferBufferSize() + 32;
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<uint8[]> buf(new uint8 [kTestSize]);
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint8* expected_data = buf.get();
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (uint32 ii = 0; ii < kTestSize; ++ii) {
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected_data[ii] = ii * 3;
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Cmds {
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::GetBucketStart get_bucket_start;
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetToken set_token1;
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::GetBucketData get_bucket_data;
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetToken set_token2;
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetBucketSize set_bucket_size2;
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem1 = GetExpectedMemory(MaxTransferBufferSize());
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo result1 = GetExpectedResultMemory(sizeof(uint32));
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem2 = GetExpectedMemory(
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kTestSize - MaxTransferBufferSize());
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Cmds expected;
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.get_bucket_start.Init(
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kBucketId, result1.id, result1.offset,
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MaxTransferBufferSize(), mem1.id, mem1.offset);
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_token1.Init(GetNextToken());
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.get_bucket_data.Init(
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kBucketId, MaxTransferBufferSize(),
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kTestSize - MaxTransferBufferSize(), mem2.id, mem2.offset);
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_bucket_size2.Init(kBucketId, 0);
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_token2.Init(GetNextToken());
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*command_buffer(), OnFlush())
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(DoAll(
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          SetMemory(result1.ptr, kTestSize),
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          SetMemoryFromArray(
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              mem1.ptr, expected_data, MaxTransferBufferSize())))
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetMemoryFromArray(
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          mem2.ptr, expected_data + MaxTransferBufferSize(),
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kTestSize - MaxTransferBufferSize()))
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<int8> data;
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetBucketContents(kBucketId, &data);
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(kTestSize, data.size());
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(expected_data, &data[0], data.size()));
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(GLES2ImplementationTest, GetShaderPrecisionFormat) {
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  struct Cmds {
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::GetShaderPrecisionFormat cmd;
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef cmds::GetShaderPrecisionFormat::Result Result;
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The first call for mediump should trigger a command buffer request.
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLint range1[2] = {0, 0};
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLint precision1 = 0;
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Cmds expected1;
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExpectedMemoryInfo client_result1 = GetExpectedResultMemory(4);
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected1.cmd.Init(GL_FRAGMENT_SHADER, GL_MEDIUM_FLOAT,
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     client_result1.id, client_result1.offset);
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Result server_result1 = {true, 14, 14, 10};
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*command_buffer(), OnFlush())
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .WillOnce(SetMemory(client_result1.ptr, server_result1))
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .RetiresOnSaturation();
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gl_->GetShaderPrecisionFormat(GL_FRAGMENT_SHADER, GL_MEDIUM_FLOAT,
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                range1, &precision1);
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const void* commands2 = GetPut();
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE(commands_, commands2);
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, memcmp(&expected1, commands_, sizeof(expected1)));
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(range1[0], 14);
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(range1[1], 14);
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(precision1, 10);
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The second call for mediump should use the cached value and avoid
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // triggering a command buffer request, so we do not expect a call to
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // OnFlush() here. We do expect the results to be correct though.
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLint range2[2] = {0, 0};
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLint precision2 = 0;
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gl_->GetShaderPrecisionFormat(GL_FRAGMENT_SHADER, GL_MEDIUM_FLOAT,
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                range2, &precision2);
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const void* commands3 = GetPut();
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(commands2, commands3);
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(range2[0], 14);
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(range2[1], 14);
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(precision2, 10);
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If we then make a request for highp, we should get another command
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // buffer request since it hasn't been cached yet.
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLint range3[2] = {0, 0};
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLint precision3 = 0;
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Cmds expected3;
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExpectedMemoryInfo result3 = GetExpectedResultMemory(4);
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected3.cmd.Init(GL_FRAGMENT_SHADER, GL_HIGH_FLOAT,
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     result3.id, result3.offset);
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Result result3_source = {true, 62, 62, 16};
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*command_buffer(), OnFlush())
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .WillOnce(SetMemory(result3.ptr, result3_source))
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .RetiresOnSaturation();
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gl_->GetShaderPrecisionFormat(GL_FRAGMENT_SHADER, GL_HIGH_FLOAT,
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                range3, &precision3);
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const void* commands4 = GetPut();
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE(commands3, commands4);
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, memcmp(&expected3, commands3, sizeof(expected3)));
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(range3[0], 62);
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(range3[1], 62);
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(precision3, 16);
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, ShaderSource) {
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 kBucketId = GLES2Implementation::kResultBucketId;
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kShaderId = 456;
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* kString1 = "foobar";
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* kString2 = "barfoo";
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t kString1Size = strlen(kString1);
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t kString2Size = strlen(kString2);
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t kString3Size = 1;  // Want the NULL;
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t kSourceSize = kString1Size + kString2Size + kString3Size;
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t kPaddedString1Size =
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      transfer_buffer_->RoundToAlignment(kString1Size);
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t kPaddedString2Size =
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      transfer_buffer_->RoundToAlignment(kString2Size);
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t kPaddedString3Size =
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      transfer_buffer_->RoundToAlignment(kString3Size);
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Cmds {
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetBucketSize set_bucket_size;
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetBucketData set_bucket_data1;
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetToken set_token1;
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetBucketData set_bucket_data2;
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetToken set_token2;
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetBucketData set_bucket_data3;
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetToken set_token3;
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::ShaderSourceBucket shader_source_bucket;
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetBucketSize clear_bucket_size;
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem1 = GetExpectedMemory(kPaddedString1Size);
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem2 = GetExpectedMemory(kPaddedString2Size);
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem3 = GetExpectedMemory(kPaddedString3Size);
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Cmds expected;
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_bucket_size.Init(kBucketId, kSourceSize);
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_bucket_data1.Init(
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kBucketId, 0, kString1Size, mem1.id, mem1.offset);
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_token1.Init(GetNextToken());
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_bucket_data2.Init(
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kBucketId, kString1Size, kString2Size, mem2.id, mem2.offset);
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_token2.Init(GetNextToken());
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_bucket_data3.Init(
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kBucketId, kString1Size + kString2Size,
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kString3Size, mem3.id, mem3.offset);
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_token3.Init(GetNextToken());
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.shader_source_bucket.Init(kShaderId, kBucketId);
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.clear_bucket_size.Init(kBucketId, 0);
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* strings[] = {
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kString1,
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kString2,
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->ShaderSource(kShaderId, 2, strings, NULL);
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, GetShaderSource) {
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 kBucketId = GLES2Implementation::kResultBucketId;
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kShaderId = 456;
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Str7 kString = {"foobar"};
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kBad = 0x12;
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Cmds {
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetBucketSize set_bucket_size1;
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::GetShaderSource get_shader_source;
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::GetBucketStart get_bucket_start;
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetToken set_token1;
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetBucketSize set_bucket_size2;
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem1 = GetExpectedMemory(MaxTransferBufferSize());
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo result1 = GetExpectedResultMemory(sizeof(uint32));
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Cmds expected;
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_bucket_size1.Init(kBucketId, 0);
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.get_shader_source.Init(kShaderId, kBucketId);
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.get_bucket_start.Init(
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kBucketId, result1.id, result1.offset,
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MaxTransferBufferSize(), mem1.id, mem1.offset);
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_token1.Init(GetNextToken());
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_bucket_size2.Init(kBucketId, 0);
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char buf[sizeof(kString) + 1];
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(buf, kBad, sizeof(buf));
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*command_buffer(), OnFlush())
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(DoAll(SetMemory(result1.ptr, uint32(sizeof(kString))),
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      SetMemory(mem1.ptr, kString)))
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei length = 0;
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetShaderSource(kShaderId, sizeof(buf), &length, buf);
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(sizeof(kString) - 1, static_cast<size_t>(length));
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(kString.str, buf);
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(buf[sizeof(kString)], kBad);
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, DrawArraysClientSideBuffers) {
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const float verts[][4] = {
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 12.0f, 23.0f, 34.0f, 45.0f, },
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 56.0f, 67.0f, 78.0f, 89.0f, },
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 13.0f, 24.0f, 35.0f, 46.0f, },
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Cmds {
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::EnableVertexAttribArray enable1;
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::EnableVertexAttribArray enable2;
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BindBuffer bind_to_emu;
7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BufferData set_size;
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BufferSubData copy_data1;
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetToken set_token1;
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::VertexAttribPointer set_pointer1;
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BufferSubData copy_data2;
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetToken set_token2;
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::VertexAttribPointer set_pointer2;
7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::DrawArrays draw;
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BindBuffer restore;
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kEmuBufferId = GLES2Implementation::kClientSideArrayId;
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kAttribIndex1 = 1;
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kAttribIndex2 = 3;
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kNumComponents1 = 3;
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kNumComponents2 = 2;
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kClientStride = sizeof(verts[0]);
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kFirst = 1;
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kCount = 2;
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kSize1 =
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arraysize(verts) * kNumComponents1 * sizeof(verts[0][0]);
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kSize2 =
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arraysize(verts) * kNumComponents2 * sizeof(verts[0][0]);
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kEmuOffset1 = 0;
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kEmuOffset2 = kSize1;
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kTotalSize = kSize1 + kSize2;
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem1 = GetExpectedMemory(kSize1);
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem2 = GetExpectedMemory(kSize2);
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Cmds expected;
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.enable1.Init(kAttribIndex1);
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.enable2.Init(kAttribIndex2);
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.bind_to_emu.Init(GL_ARRAY_BUFFER, kEmuBufferId);
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_size.Init(GL_ARRAY_BUFFER, kTotalSize, 0, 0, GL_DYNAMIC_DRAW);
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.copy_data1.Init(
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_ARRAY_BUFFER, kEmuOffset1, kSize1, mem1.id, mem1.offset);
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_token1.Init(GetNextToken());
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_pointer1.Init(
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kAttribIndex1, kNumComponents1, GL_FLOAT, GL_FALSE, 0, kEmuOffset1);
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.copy_data2.Init(
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_ARRAY_BUFFER, kEmuOffset2, kSize2, mem2.id, mem2.offset);
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_token2.Init(GetNextToken());
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_pointer2.Init(
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kAttribIndex2, kNumComponents2, GL_FLOAT, GL_FALSE, 0, kEmuOffset2);
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.draw.Init(GL_POINTS, kFirst, kCount);
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.restore.Init(GL_ARRAY_BUFFER, 0);
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->EnableVertexAttribArray(kAttribIndex1);
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->EnableVertexAttribArray(kAttribIndex2);
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->VertexAttribPointer(
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kAttribIndex1, kNumComponents1, GL_FLOAT, GL_FALSE, kClientStride, verts);
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->VertexAttribPointer(
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kAttribIndex2, kNumComponents2, GL_FLOAT, GL_FALSE, kClientStride, verts);
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->DrawArrays(GL_POINTS, kFirst, kCount);
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, DrawArraysInstancedANGLEClientSideBuffers) {
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const float verts[][4] = {
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 12.0f, 23.0f, 34.0f, 45.0f, },
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 56.0f, 67.0f, 78.0f, 89.0f, },
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 13.0f, 24.0f, 35.0f, 46.0f, },
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Cmds {
8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::EnableVertexAttribArray enable1;
8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::EnableVertexAttribArray enable2;
8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::VertexAttribDivisorANGLE divisor;
8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BindBuffer bind_to_emu;
8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BufferData set_size;
8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BufferSubData copy_data1;
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetToken set_token1;
8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::VertexAttribPointer set_pointer1;
8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BufferSubData copy_data2;
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetToken set_token2;
8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::VertexAttribPointer set_pointer2;
8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::DrawArraysInstancedANGLE draw;
8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BindBuffer restore;
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kEmuBufferId = GLES2Implementation::kClientSideArrayId;
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kAttribIndex1 = 1;
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kAttribIndex2 = 3;
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kNumComponents1 = 3;
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kNumComponents2 = 2;
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kClientStride = sizeof(verts[0]);
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kFirst = 1;
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kCount = 2;
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kDivisor = 1;
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kSize1 =
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arraysize(verts) * kNumComponents1 * sizeof(verts[0][0]);
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kSize2 =
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      1 * kNumComponents2 * sizeof(verts[0][0]);
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kEmuOffset1 = 0;
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kEmuOffset2 = kSize1;
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kTotalSize = kSize1 + kSize2;
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem1 = GetExpectedMemory(kSize1);
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem2 = GetExpectedMemory(kSize2);
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Cmds expected;
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.enable1.Init(kAttribIndex1);
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.enable2.Init(kAttribIndex2);
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.divisor.Init(kAttribIndex2, kDivisor);
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.bind_to_emu.Init(GL_ARRAY_BUFFER, kEmuBufferId);
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_size.Init(GL_ARRAY_BUFFER, kTotalSize, 0, 0, GL_DYNAMIC_DRAW);
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.copy_data1.Init(
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_ARRAY_BUFFER, kEmuOffset1, kSize1, mem1.id, mem1.offset);
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_token1.Init(GetNextToken());
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_pointer1.Init(
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kAttribIndex1, kNumComponents1, GL_FLOAT, GL_FALSE, 0, kEmuOffset1);
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.copy_data2.Init(
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_ARRAY_BUFFER, kEmuOffset2, kSize2, mem2.id, mem2.offset);
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_token2.Init(GetNextToken());
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_pointer2.Init(
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kAttribIndex2, kNumComponents2, GL_FLOAT, GL_FALSE, 0, kEmuOffset2);
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.draw.Init(GL_POINTS, kFirst, kCount, 1);
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.restore.Init(GL_ARRAY_BUFFER, 0);
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->EnableVertexAttribArray(kAttribIndex1);
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->EnableVertexAttribArray(kAttribIndex2);
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->VertexAttribPointer(
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kAttribIndex1, kNumComponents1, GL_FLOAT, GL_FALSE, kClientStride, verts);
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->VertexAttribPointer(
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kAttribIndex2, kNumComponents2, GL_FLOAT, GL_FALSE, kClientStride, verts);
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->VertexAttribDivisorANGLE(kAttribIndex2, kDivisor);
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->DrawArraysInstancedANGLE(GL_POINTS, kFirst, kCount, 1);
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, DrawElementsClientSideBuffers) {
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const float verts[][4] = {
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 12.0f, 23.0f, 34.0f, 45.0f, },
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 56.0f, 67.0f, 78.0f, 89.0f, },
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 13.0f, 24.0f, 35.0f, 46.0f, },
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const uint16 indices[] = {
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    1, 2,
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Cmds {
8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::EnableVertexAttribArray enable1;
8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::EnableVertexAttribArray enable2;
8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BindBuffer bind_to_index_emu;
8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BufferData set_index_size;
8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BufferSubData copy_data0;
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetToken set_token0;
9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BindBuffer bind_to_emu;
9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BufferData set_size;
9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BufferSubData copy_data1;
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetToken set_token1;
9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::VertexAttribPointer set_pointer1;
9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BufferSubData copy_data2;
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetToken set_token2;
9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::VertexAttribPointer set_pointer2;
9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::DrawElements draw;
9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BindBuffer restore;
9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BindBuffer restore_element;
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kIndexSize = sizeof(indices);
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kEmuBufferId = GLES2Implementation::kClientSideArrayId;
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kEmuIndexBufferId =
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLES2Implementation::kClientSideElementArrayId;
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kAttribIndex1 = 1;
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kAttribIndex2 = 3;
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kNumComponents1 = 3;
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kNumComponents2 = 2;
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kClientStride = sizeof(verts[0]);
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kCount = 2;
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kSize1 =
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arraysize(verts) * kNumComponents1 * sizeof(verts[0][0]);
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kSize2 =
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arraysize(verts) * kNumComponents2 * sizeof(verts[0][0]);
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kEmuOffset1 = 0;
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kEmuOffset2 = kSize1;
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kTotalSize = kSize1 + kSize2;
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem1 = GetExpectedMemory(kIndexSize);
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem2 = GetExpectedMemory(kSize1);
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem3 = GetExpectedMemory(kSize2);
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Cmds expected;
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.enable1.Init(kAttribIndex1);
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.enable2.Init(kAttribIndex2);
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.bind_to_index_emu.Init(GL_ELEMENT_ARRAY_BUFFER, kEmuIndexBufferId);
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_index_size.Init(
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_ELEMENT_ARRAY_BUFFER, kIndexSize, 0, 0, GL_DYNAMIC_DRAW);
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.copy_data0.Init(
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_ELEMENT_ARRAY_BUFFER, 0, kIndexSize, mem1.id, mem1.offset);
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_token0.Init(GetNextToken());
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.bind_to_emu.Init(GL_ARRAY_BUFFER, kEmuBufferId);
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_size.Init(GL_ARRAY_BUFFER, kTotalSize, 0, 0, GL_DYNAMIC_DRAW);
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.copy_data1.Init(
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_ARRAY_BUFFER, kEmuOffset1, kSize1, mem2.id, mem2.offset);
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_token1.Init(GetNextToken());
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_pointer1.Init(
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kAttribIndex1, kNumComponents1, GL_FLOAT, GL_FALSE, 0, kEmuOffset1);
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.copy_data2.Init(
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_ARRAY_BUFFER, kEmuOffset2, kSize2, mem3.id, mem3.offset);
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_token2.Init(GetNextToken());
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_pointer2.Init(kAttribIndex2, kNumComponents2,
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             GL_FLOAT, GL_FALSE, 0, kEmuOffset2);
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.draw.Init(GL_POINTS, kCount, GL_UNSIGNED_SHORT, 0);
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.restore.Init(GL_ARRAY_BUFFER, 0);
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.restore_element.Init(GL_ELEMENT_ARRAY_BUFFER, 0);
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->EnableVertexAttribArray(kAttribIndex1);
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->EnableVertexAttribArray(kAttribIndex2);
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->VertexAttribPointer(kAttribIndex1, kNumComponents1,
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           GL_FLOAT, GL_FALSE, kClientStride, verts);
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->VertexAttribPointer(kAttribIndex2, kNumComponents2,
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           GL_FLOAT, GL_FALSE, kClientStride, verts);
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->DrawElements(GL_POINTS, kCount, GL_UNSIGNED_SHORT, indices);
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, DrawElementsClientSideBuffersIndexUint) {
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const float verts[][4] = {
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 12.0f, 23.0f, 34.0f, 45.0f, },
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 56.0f, 67.0f, 78.0f, 89.0f, },
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 13.0f, 24.0f, 35.0f, 46.0f, },
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const uint32 indices[] = {
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    1, 2,
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_index_emu;
9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BufferData set_index_size;
9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BufferSubData copy_data0;
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetToken set_token0;
9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BindBuffer bind_to_emu;
9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BufferData set_size;
9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BufferSubData copy_data1;
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetToken set_token1;
9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::VertexAttribPointer set_pointer1;
9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BufferSubData copy_data2;
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetToken set_token2;
9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::VertexAttribPointer set_pointer2;
9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::DrawElements draw;
9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BindBuffer restore;
9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BindBuffer restore_element;
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kIndexSize = sizeof(indices);
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kEmuBufferId = GLES2Implementation::kClientSideArrayId;
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kEmuIndexBufferId =
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLES2Implementation::kClientSideElementArrayId;
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kAttribIndex1 = 1;
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kAttribIndex2 = 3;
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kNumComponents1 = 3;
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kNumComponents2 = 2;
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kClientStride = sizeof(verts[0]);
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kCount = 2;
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kSize1 =
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arraysize(verts) * kNumComponents1 * sizeof(verts[0][0]);
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kSize2 =
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arraysize(verts) * kNumComponents2 * sizeof(verts[0][0]);
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kEmuOffset1 = 0;
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kEmuOffset2 = kSize1;
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kTotalSize = kSize1 + kSize2;
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem1 = GetExpectedMemory(kIndexSize);
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem2 = GetExpectedMemory(kSize1);
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem3 = GetExpectedMemory(kSize2);
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Cmds expected;
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.enable1.Init(kAttribIndex1);
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.enable2.Init(kAttribIndex2);
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.bind_to_index_emu.Init(GL_ELEMENT_ARRAY_BUFFER, kEmuIndexBufferId);
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_index_size.Init(
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_ELEMENT_ARRAY_BUFFER, kIndexSize, 0, 0, GL_DYNAMIC_DRAW);
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.copy_data0.Init(
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_ELEMENT_ARRAY_BUFFER, 0, kIndexSize, mem1.id, mem1.offset);
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_token0.Init(GetNextToken());
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.bind_to_emu.Init(GL_ARRAY_BUFFER, kEmuBufferId);
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_size.Init(GL_ARRAY_BUFFER, kTotalSize, 0, 0, GL_DYNAMIC_DRAW);
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.copy_data1.Init(
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_ARRAY_BUFFER, kEmuOffset1, kSize1, mem2.id, mem2.offset);
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_token1.Init(GetNextToken());
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_pointer1.Init(
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kAttribIndex1, kNumComponents1, GL_FLOAT, GL_FALSE, 0, kEmuOffset1);
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.copy_data2.Init(
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_ARRAY_BUFFER, kEmuOffset2, kSize2, mem3.id, mem3.offset);
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_token2.Init(GetNextToken());
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_pointer2.Init(kAttribIndex2, kNumComponents2,
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             GL_FLOAT, GL_FALSE, 0, kEmuOffset2);
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.draw.Init(GL_POINTS, kCount, GL_UNSIGNED_INT, 0);
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.restore.Init(GL_ARRAY_BUFFER, 0);
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.restore_element.Init(GL_ELEMENT_ARRAY_BUFFER, 0);
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->EnableVertexAttribArray(kAttribIndex1);
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->EnableVertexAttribArray(kAttribIndex2);
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->VertexAttribPointer(kAttribIndex1, kNumComponents1,
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           GL_FLOAT, GL_FALSE, kClientStride, verts);
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->VertexAttribPointer(kAttribIndex2, kNumComponents2,
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           GL_FLOAT, GL_FALSE, kClientStride, verts);
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->DrawElements(GL_POINTS, kCount, GL_UNSIGNED_INT, indices);
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, DrawElementsClientSideBuffersInvalidIndexUint) {
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const float verts[][4] = {
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 12.0f, 23.0f, 34.0f, 45.0f, },
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 56.0f, 67.0f, 78.0f, 89.0f, },
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 13.0f, 24.0f, 35.0f, 46.0f, },
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const uint32 indices[] = {
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    1, 0x90000000
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kAttribIndex1 = 1;
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kAttribIndex2 = 3;
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kNumComponents1 = 3;
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kNumComponents2 = 2;
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kClientStride = sizeof(verts[0]);
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kCount = 2;
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*command_buffer(), OnFlush())
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->EnableVertexAttribArray(kAttribIndex1);
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->EnableVertexAttribArray(kAttribIndex2);
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->VertexAttribPointer(kAttribIndex1, kNumComponents1,
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           GL_FLOAT, GL_FALSE, kClientStride, verts);
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->VertexAttribPointer(kAttribIndex2, kNumComponents2,
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           GL_FLOAT, GL_FALSE, kClientStride, verts);
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->DrawElements(GL_POINTS, kCount, GL_UNSIGNED_INT, indices);
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), gl_->GetError());
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest,
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       DrawElementsClientSideBuffersServiceSideIndices) {
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const float verts[][4] = {
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 12.0f, 23.0f, 34.0f, 45.0f, },
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 56.0f, 67.0f, 78.0f, 89.0f, },
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 13.0f, 24.0f, 35.0f, 46.0f, },
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Cmds {
10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::EnableVertexAttribArray enable1;
10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::EnableVertexAttribArray enable2;
10942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BindBuffer bind_to_index;
10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::GetMaxValueInBufferCHROMIUM get_max;
10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BindBuffer bind_to_emu;
10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BufferData set_size;
10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BufferSubData copy_data1;
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetToken set_token1;
11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::VertexAttribPointer set_pointer1;
11012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BufferSubData copy_data2;
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetToken set_token2;
11032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::VertexAttribPointer set_pointer2;
11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::DrawElements draw;
11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BindBuffer restore;
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kEmuBufferId = GLES2Implementation::kClientSideArrayId;
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClientIndexBufferId = 0x789;
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kIndexOffset = 0x40;
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kMaxIndex = 2;
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kAttribIndex1 = 1;
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kAttribIndex2 = 3;
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kNumComponents1 = 3;
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kNumComponents2 = 2;
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kClientStride = sizeof(verts[0]);
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kCount = 2;
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kSize1 =
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arraysize(verts) * kNumComponents1 * sizeof(verts[0][0]);
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kSize2 =
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arraysize(verts) * kNumComponents2 * sizeof(verts[0][0]);
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kEmuOffset1 = 0;
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kEmuOffset2 = kSize1;
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kTotalSize = kSize1 + kSize2;
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem1 = GetExpectedResultMemory(sizeof(uint32));
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem2 = GetExpectedMemory(kSize1);
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem3 = GetExpectedMemory(kSize2);
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Cmds expected;
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.enable1.Init(kAttribIndex1);
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.enable2.Init(kAttribIndex2);
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.bind_to_index.Init(GL_ELEMENT_ARRAY_BUFFER, kClientIndexBufferId);
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.get_max.Init(kClientIndexBufferId, kCount, GL_UNSIGNED_SHORT,
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        kIndexOffset, mem1.id, mem1.offset);
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.bind_to_emu.Init(GL_ARRAY_BUFFER, kEmuBufferId);
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_size.Init(GL_ARRAY_BUFFER, kTotalSize, 0, 0, GL_DYNAMIC_DRAW);
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.copy_data1.Init(
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_ARRAY_BUFFER, kEmuOffset1, kSize1, mem2.id, mem2.offset);
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_token1.Init(GetNextToken());
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_pointer1.Init(kAttribIndex1, kNumComponents1,
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             GL_FLOAT, GL_FALSE, 0, kEmuOffset1);
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.copy_data2.Init(
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_ARRAY_BUFFER, kEmuOffset2, kSize2, mem3.id, mem3.offset);
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_token2.Init(GetNextToken());
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_pointer2.Init(kAttribIndex2, kNumComponents2,
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             GL_FLOAT, GL_FALSE, 0, kEmuOffset2);
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.draw.Init(GL_POINTS, kCount, GL_UNSIGNED_SHORT, kIndexOffset);
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.restore.Init(GL_ARRAY_BUFFER, 0);
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*command_buffer(), OnFlush())
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetMemory(mem1.ptr,kMaxIndex))
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->EnableVertexAttribArray(kAttribIndex1);
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->EnableVertexAttribArray(kAttribIndex2);
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->BindBuffer(GL_ELEMENT_ARRAY_BUFFER, kClientIndexBufferId);
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->VertexAttribPointer(kAttribIndex1, kNumComponents1,
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           GL_FLOAT, GL_FALSE, kClientStride, verts);
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->VertexAttribPointer(kAttribIndex2, kNumComponents2,
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           GL_FLOAT, GL_FALSE, kClientStride, verts);
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->DrawElements(GL_POINTS, kCount, GL_UNSIGNED_SHORT,
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    reinterpret_cast<const void*>(kIndexOffset));
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, DrawElementsInstancedANGLEClientSideBuffers) {
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const float verts[][4] = {
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 12.0f, 23.0f, 34.0f, 45.0f, },
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 56.0f, 67.0f, 78.0f, 89.0f, },
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 13.0f, 24.0f, 35.0f, 46.0f, },
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const uint16 indices[] = {
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    1, 2,
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Cmds {
11772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::EnableVertexAttribArray enable1;
11782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::EnableVertexAttribArray enable2;
11792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::VertexAttribDivisorANGLE divisor;
11802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BindBuffer bind_to_index_emu;
11812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BufferData set_index_size;
11822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BufferSubData copy_data0;
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetToken set_token0;
11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BindBuffer bind_to_emu;
11852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BufferData set_size;
11862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BufferSubData copy_data1;
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetToken set_token1;
11882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::VertexAttribPointer set_pointer1;
11892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BufferSubData copy_data2;
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetToken set_token2;
11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::VertexAttribPointer set_pointer2;
11922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::DrawElementsInstancedANGLE draw;
11932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BindBuffer restore;
11942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BindBuffer restore_element;
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kIndexSize = sizeof(indices);
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kEmuBufferId = GLES2Implementation::kClientSideArrayId;
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kEmuIndexBufferId =
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLES2Implementation::kClientSideElementArrayId;
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kAttribIndex1 = 1;
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kAttribIndex2 = 3;
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kNumComponents1 = 3;
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kNumComponents2 = 2;
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kClientStride = sizeof(verts[0]);
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kCount = 2;
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kSize1 =
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arraysize(verts) * kNumComponents1 * sizeof(verts[0][0]);
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kSize2 =
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      1 * kNumComponents2 * sizeof(verts[0][0]);
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kDivisor = 1;
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kEmuOffset1 = 0;
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kEmuOffset2 = kSize1;
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kTotalSize = kSize1 + kSize2;
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem1 = GetExpectedMemory(kIndexSize);
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem2 = GetExpectedMemory(kSize1);
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem3 = GetExpectedMemory(kSize2);
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Cmds expected;
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.enable1.Init(kAttribIndex1);
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.enable2.Init(kAttribIndex2);
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.divisor.Init(kAttribIndex2, kDivisor);
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.bind_to_index_emu.Init(GL_ELEMENT_ARRAY_BUFFER, kEmuIndexBufferId);
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_index_size.Init(
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_ELEMENT_ARRAY_BUFFER, kIndexSize, 0, 0, GL_DYNAMIC_DRAW);
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.copy_data0.Init(
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_ELEMENT_ARRAY_BUFFER, 0, kIndexSize, mem1.id, mem1.offset);
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_token0.Init(GetNextToken());
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.bind_to_emu.Init(GL_ARRAY_BUFFER, kEmuBufferId);
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_size.Init(GL_ARRAY_BUFFER, kTotalSize, 0, 0, GL_DYNAMIC_DRAW);
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.copy_data1.Init(
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_ARRAY_BUFFER, kEmuOffset1, kSize1, mem2.id, mem2.offset);
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_token1.Init(GetNextToken());
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_pointer1.Init(
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kAttribIndex1, kNumComponents1, GL_FLOAT, GL_FALSE, 0, kEmuOffset1);
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.copy_data2.Init(
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_ARRAY_BUFFER, kEmuOffset2, kSize2, mem3.id, mem3.offset);
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_token2.Init(GetNextToken());
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_pointer2.Init(kAttribIndex2, kNumComponents2,
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             GL_FLOAT, GL_FALSE, 0, kEmuOffset2);
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.draw.Init(GL_POINTS, kCount, GL_UNSIGNED_SHORT, 0, 1);
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.restore.Init(GL_ARRAY_BUFFER, 0);
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.restore_element.Init(GL_ELEMENT_ARRAY_BUFFER, 0);
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->EnableVertexAttribArray(kAttribIndex1);
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->EnableVertexAttribArray(kAttribIndex2);
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->VertexAttribPointer(kAttribIndex1, kNumComponents1,
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           GL_FLOAT, GL_FALSE, kClientStride, verts);
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->VertexAttribPointer(kAttribIndex2, kNumComponents2,
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           GL_FLOAT, GL_FALSE, kClientStride, verts);
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->VertexAttribDivisorANGLE(kAttribIndex2, kDivisor);
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->DrawElementsInstancedANGLE(
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_POINTS, kCount, GL_UNSIGNED_SHORT, indices, 1);
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, GetVertexBufferPointerv) {
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const float verts[1] = { 0.0f, };
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kAttribIndex1 = 1;
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kAttribIndex2 = 3;
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kNumComponents1 = 3;
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kNumComponents2 = 2;
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kStride1 = 12;
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kStride2 = 0;
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kBufferId = 0x123;
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kOffset2 = 0x456;
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // It's all cached on the client side so no get commands are issued.
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Cmds {
12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BindBuffer bind;
12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::VertexAttribPointer set_pointer;
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Cmds expected;
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.bind.Init(GL_ARRAY_BUFFER, kBufferId);
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_pointer.Init(kAttribIndex2, kNumComponents2, GL_FLOAT, GL_FALSE,
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            kStride2, kOffset2);
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set one client side buffer.
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->VertexAttribPointer(kAttribIndex1, kNumComponents1,
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           GL_FLOAT, GL_FALSE, kStride1, verts);
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set one VBO
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->BindBuffer(GL_ARRAY_BUFFER, kBufferId);
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->VertexAttribPointer(kAttribIndex2, kNumComponents2,
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           GL_FLOAT, GL_FALSE, kStride2,
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           reinterpret_cast<const void*>(kOffset2));
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // now get them both.
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* ptr1 = NULL;
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* ptr2 = NULL;
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetVertexAttribPointerv(
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kAttribIndex1, GL_VERTEX_ATTRIB_ARRAY_POINTER, &ptr1);
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetVertexAttribPointerv(
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kAttribIndex2, GL_VERTEX_ATTRIB_ARRAY_POINTER, &ptr2);
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(static_cast<const void*>(&verts) == ptr1);
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ptr2 == reinterpret_cast<void*>(kOffset2));
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, GetVertexAttrib) {
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const float verts[1] = { 0.0f, };
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kAttribIndex1 = 1;
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kAttribIndex2 = 3;
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kNumComponents1 = 3;
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kNumComponents2 = 2;
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kStride1 = 12;
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kStride2 = 0;
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kBufferId = 0x123;
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kOffset2 = 0x456;
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Only one set and one get because the client side buffer's info is stored
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // on the client side.
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Cmds {
13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::EnableVertexAttribArray enable;
13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BindBuffer bind;
13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::VertexAttribPointer set_pointer;
13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::GetVertexAttribfv get2;  // for getting the value from attrib1
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem2 = GetExpectedResultMemory(16);
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Cmds expected;
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.enable.Init(kAttribIndex1);
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.bind.Init(GL_ARRAY_BUFFER, kBufferId);
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_pointer.Init(kAttribIndex2, kNumComponents2, GL_FLOAT, GL_FALSE,
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            kStride2, kOffset2);
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.get2.Init(kAttribIndex1,
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     GL_CURRENT_VERTEX_ATTRIB,
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     mem2.id, mem2.offset);
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FourFloats current_attrib(1.2f, 3.4f, 5.6f, 7.8f);
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // One call to flush to wait for last call to GetVertexAttribiv
13342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // as others are all cached.
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*command_buffer(), OnFlush())
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetMemory(
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          mem2.ptr, SizedResultHelper<FourFloats>(current_attrib)))
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->EnableVertexAttribArray(kAttribIndex1);
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set one client side buffer.
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->VertexAttribPointer(kAttribIndex1, kNumComponents1,
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           GL_FLOAT, GL_FALSE, kStride1, verts);
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set one VBO
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->BindBuffer(GL_ARRAY_BUFFER, kBufferId);
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->VertexAttribPointer(kAttribIndex2, kNumComponents2,
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           GL_FLOAT, GL_FALSE, kStride2,
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           reinterpret_cast<const void*>(kOffset2));
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // first get the service side once to see that we make a command
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint buffer_id = 0;
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint enabled = 0;
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint size = 0;
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint stride = 0;
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint type = 0;
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint normalized = 1;
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float current[4] = { 0.0f, };
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetVertexAttribiv(
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kAttribIndex2, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, &buffer_id);
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kBufferId, static_cast<GLuint>(buffer_id));
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetVertexAttribiv(
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kAttribIndex1, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, &buffer_id);
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetVertexAttribiv(
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kAttribIndex1, GL_VERTEX_ATTRIB_ARRAY_ENABLED, &enabled);
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetVertexAttribiv(
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kAttribIndex1, GL_VERTEX_ATTRIB_ARRAY_SIZE, &size);
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetVertexAttribiv(
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kAttribIndex1, GL_VERTEX_ATTRIB_ARRAY_STRIDE, &stride);
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetVertexAttribiv(
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kAttribIndex1, GL_VERTEX_ATTRIB_ARRAY_TYPE, &type);
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetVertexAttribiv(
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kAttribIndex1, GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, &normalized);
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetVertexAttribfv(
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kAttribIndex1, GL_CURRENT_VERTEX_ATTRIB, &current[0]);
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, buffer_id);
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_TRUE, enabled);
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kNumComponents1, size);
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kStride1, stride);
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_FLOAT, type);
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_FALSE, normalized);
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(&current_attrib, &current, sizeof(current_attrib)));
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, ReservedIds) {
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Only the get error command should be issued.
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Cmds {
13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::GetError get;
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Cmds expected;
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExpectedMemoryInfo mem1 = GetExpectedResultMemory(
13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      sizeof(cmds::GetError::Result));
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.get.Init(mem1.id, mem1.offset);
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // One call to flush to wait for GetError
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*command_buffer(), OnFlush())
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetMemory(mem1.ptr, GLuint(GL_NO_ERROR)))
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->BindBuffer(
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_ARRAY_BUFFER,
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLES2Implementation::kClientSideArrayId);
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->BindBuffer(
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_ARRAY_BUFFER,
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLES2Implementation::kClientSideElementArrayId);
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum err = gl_->GetError();
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), err);
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, ReadPixels2Reads) {
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Cmds {
14192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::ReadPixels read1;
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetToken set_token1;
14212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::ReadPixels read2;
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetToken set_token2;
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kBytesPerPixel = 4;
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kWidth =
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (kTransferBufferSize - GLES2Implementation::kStartingOffset) /
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kBytesPerPixel;
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kHeight = 2;
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kFormat = GL_RGBA;
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kType = GL_UNSIGNED_BYTE;
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem1 =
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetExpectedMemory(kWidth * kHeight / 2 * kBytesPerPixel);
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo result1 =
14352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExpectedResultMemory(sizeof(cmds::ReadPixels::Result));
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem2 =
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetExpectedMemory(kWidth * kHeight / 2 * kBytesPerPixel);
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo result2 =
14392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExpectedResultMemory(sizeof(cmds::ReadPixels::Result));
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Cmds expected;
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.read1.Init(
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0, 0, kWidth, kHeight / 2, kFormat, kType,
1444a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      mem1.id, mem1.offset, result1.id, result1.offset,
1445a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      false);
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_token1.Init(GetNextToken());
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.read2.Init(
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0, kHeight / 2, kWidth, kHeight / 2, kFormat, kType,
1449a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      mem2.id, mem2.offset, result2.id, result2.offset, false);
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_token2.Init(GetNextToken());
1451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<int8[]> buffer(new int8[kWidth * kHeight * kBytesPerPixel]);
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*command_buffer(), OnFlush())
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetMemory(result1.ptr, static_cast<uint32>(1)))
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetMemory(result2.ptr, static_cast<uint32>(1)))
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->ReadPixels(0, 0, kWidth, kHeight, kFormat, kType, buffer.get());
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, ReadPixelsBadFormatType) {
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Cmds {
14642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::ReadPixels read;
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetToken set_token;
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kBytesPerPixel = 4;
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kWidth = 2;
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kHeight = 2;
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kFormat = 0;
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kType = 0;
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem1 =
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetExpectedMemory(kWidth * kHeight * kBytesPerPixel);
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo result1 =
14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExpectedResultMemory(sizeof(cmds::ReadPixels::Result));
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Cmds expected;
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.read.Init(
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0, 0, kWidth, kHeight, kFormat, kType,
1481a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      mem1.id, mem1.offset, result1.id, result1.offset, false);
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_token.Init(GetNextToken());
1483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<int8[]> buffer(new int8[kWidth * kHeight * kBytesPerPixel]);
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*command_buffer(), OnFlush())
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->ReadPixels(0, 0, kWidth, kHeight, kFormat, kType, buffer.get());
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, FreeUnusedSharedMemory) {
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Cmds {
14942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BufferSubData buf;
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetToken set_token;
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kTarget = GL_ELEMENT_ARRAY_BUFFER;
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLintptr kOffset = 15;
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizeiptr kSize = 16;
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem1 = GetExpectedMemory(kSize);
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Cmds expected;
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.buf.Init(
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kTarget, kOffset, kSize, mem1.id, mem1.offset);
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_token.Init(GetNextToken());
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* mem = gl_->MapBufferSubDataCHROMIUM(
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kTarget, kOffset, kSize, GL_WRITE_ONLY);
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(mem != NULL);
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->UnmapBufferSubDataCHROMIUM(mem);
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*command_buffer(), DestroyTransferBuffer(_))
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->FreeUnusedSharedMemory();
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, MapUnmapBufferSubDataCHROMIUM) {
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Cmds {
15202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BufferSubData buf;
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetToken set_token;
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kTarget = GL_ELEMENT_ARRAY_BUFFER;
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLintptr kOffset = 15;
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizeiptr kSize = 16;
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 offset = 0;
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Cmds expected;
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.buf.Init(
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kTarget, kOffset, kSize,
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      command_buffer()->GetNextFreeTransferBufferId(), offset);
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_token.Init(GetNextToken());
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* mem = gl_->MapBufferSubDataCHROMIUM(
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kTarget, kOffset, kSize, GL_WRITE_ONLY);
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(mem != NULL);
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->UnmapBufferSubDataCHROMIUM(mem);
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, MapUnmapBufferSubDataCHROMIUMBadArgs) {
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kTarget = GL_ELEMENT_ARRAY_BUFFER;
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLintptr kOffset = 15;
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizeiptr kSize = 16;
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo result1 =
15472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExpectedResultMemory(sizeof(cmds::GetError::Result));
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo result2 =
15492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExpectedResultMemory(sizeof(cmds::GetError::Result));
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo result3 =
15512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExpectedResultMemory(sizeof(cmds::GetError::Result));
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo result4 =
15532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExpectedResultMemory(sizeof(cmds::GetError::Result));
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Calls to flush to wait for GetError
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*command_buffer(), OnFlush())
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetMemory(result1.ptr, GLuint(GL_NO_ERROR)))
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetMemory(result2.ptr, GLuint(GL_NO_ERROR)))
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetMemory(result3.ptr, GLuint(GL_NO_ERROR)))
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetMemory(result4.ptr, GLuint(GL_NO_ERROR)))
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* mem;
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mem = gl_->MapBufferSubDataCHROMIUM(kTarget, -1, kSize, GL_WRITE_ONLY);
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(mem == NULL);
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError());
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mem = gl_->MapBufferSubDataCHROMIUM(kTarget, kOffset, -1, GL_WRITE_ONLY);
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(mem == NULL);
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError());
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mem = gl_->MapBufferSubDataCHROMIUM(kTarget, kOffset, kSize, GL_READ_ONLY);
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(mem == NULL);
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_INVALID_ENUM), gl_->GetError());
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* kPtr = "something";
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->UnmapBufferSubDataCHROMIUM(kPtr);
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError());
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, MapUnmapTexSubImage2DCHROMIUM) {
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Cmds {
15802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::TexSubImage2D tex;
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetToken set_token;
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kLevel = 1;
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kXOffset = 2;
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kYOffset = 3;
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kWidth = 4;
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kHeight = 5;
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kFormat = GL_RGBA;
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kType = GL_UNSIGNED_BYTE;
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 offset = 0;
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Cmds expected;
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.tex.Init(
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_TEXTURE_2D, kLevel, kXOffset, kYOffset, kWidth, kHeight, kFormat,
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kType,
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      command_buffer()->GetNextFreeTransferBufferId(), offset, GL_FALSE);
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_token.Init(GetNextToken());
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* mem = gl_->MapTexSubImage2DCHROMIUM(
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_TEXTURE_2D,
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kLevel,
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kXOffset,
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kYOffset,
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kWidth,
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kHeight,
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kFormat,
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kType,
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_WRITE_ONLY);
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(mem != NULL);
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->UnmapTexSubImage2DCHROMIUM(mem);
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, MapUnmapTexSubImage2DCHROMIUMBadArgs) {
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kLevel = 1;
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kXOffset = 2;
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kYOffset = 3;
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kWidth = 4;
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kHeight = 5;
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kFormat = GL_RGBA;
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kType = GL_UNSIGNED_BYTE;
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo result1 =
16242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExpectedResultMemory(sizeof(cmds::GetError::Result));
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo result2 =
16262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExpectedResultMemory(sizeof(cmds::GetError::Result));
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo result3 =
16282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExpectedResultMemory(sizeof(cmds::GetError::Result));
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo result4 =
16302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExpectedResultMemory(sizeof(cmds::GetError::Result));
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo result5 =
16322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExpectedResultMemory(sizeof(cmds::GetError::Result));
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo result6 =
16342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExpectedResultMemory(sizeof(cmds::GetError::Result));
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo result7 =
16362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExpectedResultMemory(sizeof(cmds::GetError::Result));
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Calls to flush to wait for GetError
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*command_buffer(), OnFlush())
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetMemory(result1.ptr, GLuint(GL_NO_ERROR)))
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetMemory(result2.ptr, GLuint(GL_NO_ERROR)))
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetMemory(result3.ptr, GLuint(GL_NO_ERROR)))
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetMemory(result4.ptr, GLuint(GL_NO_ERROR)))
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetMemory(result5.ptr, GLuint(GL_NO_ERROR)))
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetMemory(result6.ptr, GLuint(GL_NO_ERROR)))
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetMemory(result7.ptr, GLuint(GL_NO_ERROR)))
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* mem;
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mem = gl_->MapTexSubImage2DCHROMIUM(
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GL_TEXTURE_2D,
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    -1,
16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kXOffset,
16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kYOffset,
16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kWidth,
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kHeight,
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kFormat,
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kType,
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GL_WRITE_ONLY);
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(mem == NULL);
16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError());
16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mem = gl_->MapTexSubImage2DCHROMIUM(
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GL_TEXTURE_2D,
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kLevel,
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    -1,
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kYOffset,
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kWidth,
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kHeight,
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kFormat,
16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kType,
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GL_WRITE_ONLY);
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(mem == NULL);
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError());
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mem = gl_->MapTexSubImage2DCHROMIUM(
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GL_TEXTURE_2D,
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kLevel,
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kXOffset,
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    -1,
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kWidth,
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kHeight,
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kFormat,
16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kType,
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GL_WRITE_ONLY);
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(mem == NULL);
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError());
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mem = gl_->MapTexSubImage2DCHROMIUM(
16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GL_TEXTURE_2D,
16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kLevel,
16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kXOffset,
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kYOffset,
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    -1,
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kHeight,
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kFormat,
16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kType,
16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GL_WRITE_ONLY);
16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(mem == NULL);
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError());
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mem = gl_->MapTexSubImage2DCHROMIUM(
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GL_TEXTURE_2D,
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kLevel,
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kXOffset,
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kYOffset,
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kWidth,
17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    -1,
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kFormat,
17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kType,
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GL_WRITE_ONLY);
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(mem == NULL);
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError());
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mem = gl_->MapTexSubImage2DCHROMIUM(
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GL_TEXTURE_2D,
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kLevel,
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kXOffset,
17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kYOffset,
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kWidth,
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kHeight,
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kFormat,
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kType,
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GL_READ_ONLY);
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(mem == NULL);
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_INVALID_ENUM), gl_->GetError());
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* kPtr = "something";
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->UnmapTexSubImage2DCHROMIUM(kPtr);
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError());
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, GetMultipleIntegervCHROMIUMValidArgs) {
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum pnames[] = {
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GL_DEPTH_WRITEMASK,
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GL_COLOR_WRITEMASK,
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GL_STENCIL_WRITEMASK,
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint num_results = 6;
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint results[num_results + 1];
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Cmds {
17362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::GetMultipleIntegervCHROMIUM get_multiple;
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetToken set_token;
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kNumPnames = arraysize(pnames);
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizeiptr kResultsSize = num_results * sizeof(results[0]);
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t kPNamesSize = kNumPnames * sizeof(pnames[0]);
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem1 = GetExpectedMemory(kPNamesSize + kResultsSize);
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo result1 = GetExpectedResultMemory(
17452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      sizeof(cmds::GetError::Result));
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 kPnamesOffset = mem1.offset;
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 kResultsOffset = mem1.offset + kPNamesSize;
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Cmds expected;
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.get_multiple.Init(
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mem1.id, kPnamesOffset, kNumPnames,
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mem1.id, kResultsOffset, kResultsSize);
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_token.Init(GetNextToken());
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kSentinel = 0x12345678;
17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(results, 0, sizeof(results));
17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  results[num_results] = kSentinel;
17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint returned_results[] = {
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    1, 0, 1, 0, 1, -1,
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // One call to flush to wait for results
17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*command_buffer(), OnFlush())
17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetMemoryFromArray(mem1.ptr + kPNamesSize,
17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   returned_results, sizeof(returned_results)))
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetMemory(result1.ptr, GLuint(GL_NO_ERROR)))
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetMultipleIntegervCHROMIUM(
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &pnames[0], kNumPnames, &results[0], kResultsSize);
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(&returned_results, results, sizeof(returned_results)));
17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kSentinel, results[num_results]);
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), gl_->GetError());
17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, GetMultipleIntegervCHROMIUMBadArgs) {
17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum pnames[] = {
17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GL_DEPTH_WRITEMASK,
17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GL_COLOR_WRITEMASK,
17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GL_STENCIL_WRITEMASK,
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint num_results = 6;
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint results[num_results + 1];
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kNumPnames = arraysize(pnames);
17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizeiptr kResultsSize = num_results * sizeof(results[0]);
17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo result1 =
17882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExpectedResultMemory(sizeof(cmds::GetError::Result));
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo result2 =
17902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExpectedResultMemory(sizeof(cmds::GetError::Result));
17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo result3 =
17922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExpectedResultMemory(sizeof(cmds::GetError::Result));
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo result4 =
17942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExpectedResultMemory(sizeof(cmds::GetError::Result));
17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Calls to flush to wait for GetError
17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*command_buffer(), OnFlush())
17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetMemory(result1.ptr, GLuint(GL_NO_ERROR)))
17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetMemory(result2.ptr, GLuint(GL_NO_ERROR)))
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetMemory(result3.ptr, GLuint(GL_NO_ERROR)))
18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetMemory(result4.ptr, GLuint(GL_NO_ERROR)))
18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kSentinel = 0x12345678;
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(results, 0, sizeof(results));
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  results[num_results] = kSentinel;
18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // try bad size.
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetMultipleIntegervCHROMIUM(
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &pnames[0], kNumPnames, &results[0], kResultsSize + 1);
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(NoCommandsWritten());
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError());
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, results[0]);
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kSentinel, results[num_results]);
18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // try bad size.
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearCommands();
18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetMultipleIntegervCHROMIUM(
18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &pnames[0], kNumPnames, &results[0], kResultsSize - 1);
18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(NoCommandsWritten());
18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError());
18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, results[0]);
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kSentinel, results[num_results]);
18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // try uncleared results.
18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearCommands();
18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  results[2] = 1;
18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetMultipleIntegervCHROMIUM(
18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &pnames[0], kNumPnames, &results[0], kResultsSize);
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(NoCommandsWritten());
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError());
18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, results[0]);
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kSentinel, results[num_results]);
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // try bad enum results.
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearCommands();
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  results[2] = 0;
18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pnames[1] = GL_TRUE;
18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetMultipleIntegervCHROMIUM(
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &pnames[0], kNumPnames, &results[0], kResultsSize);
18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(NoCommandsWritten());
18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_INVALID_ENUM), gl_->GetError());
18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, results[0]);
18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kSentinel, results[num_results]);
18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, GetProgramInfoCHROMIUMGoodArgs) {
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 kBucketId = GLES2Implementation::kResultBucketId;
18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kProgramId = 123;
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kBad = 0x12;
18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei size = 0;
18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Str7 kString = {"foobar"};
18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char buf[20];
18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem1 =
18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetExpectedMemory(MaxTransferBufferSize());
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo result1 =
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetExpectedResultMemory(sizeof(cmd::GetBucketStart::Result));
18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo result2 =
18562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExpectedResultMemory(sizeof(cmds::GetError::Result));
18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(buf, kBad, sizeof(buf));
18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*command_buffer(), OnFlush())
18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(DoAll(SetMemory(result1.ptr, uint32(sizeof(kString))),
18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      SetMemory(mem1.ptr, kString)))
18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetMemory(result2.ptr, GLuint(GL_NO_ERROR)))
18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Cmds {
18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetBucketSize set_bucket_size1;
18672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::GetProgramInfoCHROMIUM get_program_info;
18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::GetBucketStart get_bucket_start;
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetToken set_token1;
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetBucketSize set_bucket_size2;
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Cmds expected;
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_bucket_size1.Init(kBucketId, 0);
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.get_program_info.Init(kProgramId, kBucketId);
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.get_bucket_start.Init(
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kBucketId, result1.id, result1.offset,
18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MaxTransferBufferSize(), mem1.id, mem1.offset);
18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_token1.Init(GetNextToken());
18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_bucket_size2.Init(kBucketId, 0);
18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetProgramInfoCHROMIUM(kProgramId, sizeof(buf), &size, &buf);
18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), gl_->GetError());
18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(sizeof(kString), static_cast<size_t>(size));
18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(kString.str, buf);
18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(buf[sizeof(kString)], kBad);
18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, GetProgramInfoCHROMIUMBadArgs) {
18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 kBucketId = GLES2Implementation::kResultBucketId;
18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kProgramId = 123;
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei size = 0;
18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Str7 kString = {"foobar"};
18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char buf[20];
18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem1 = GetExpectedMemory(MaxTransferBufferSize());
18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo result1 =
18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetExpectedResultMemory(sizeof(cmd::GetBucketStart::Result));
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo result2 =
18992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExpectedResultMemory(sizeof(cmds::GetError::Result));
19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo result3 =
19012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExpectedResultMemory(sizeof(cmds::GetError::Result));
19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo result4 =
19032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExpectedResultMemory(sizeof(cmds::GetError::Result));
19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*command_buffer(), OnFlush())
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(DoAll(SetMemory(result1.ptr, uint32(sizeof(kString))),
19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      SetMemory(mem1.ptr,  kString)))
19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetMemory(result2.ptr, GLuint(GL_NO_ERROR)))
19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetMemory(result3.ptr, GLuint(GL_NO_ERROR)))
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetMemory(result4.ptr, GLuint(GL_NO_ERROR)))
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // try bufsize not big enough.
19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Cmds {
19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetBucketSize set_bucket_size1;
19162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::GetProgramInfoCHROMIUM get_program_info;
19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::GetBucketStart get_bucket_start;
19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetToken set_token1;
19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetBucketSize set_bucket_size2;
19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Cmds expected;
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_bucket_size1.Init(kBucketId, 0);
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.get_program_info.Init(kProgramId, kBucketId);
19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.get_bucket_start.Init(
19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kBucketId, result1.id, result1.offset,
19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MaxTransferBufferSize(), mem1.id, mem1.offset);
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_token1.Init(GetNextToken());
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_bucket_size2.Init(kBucketId, 0);
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetProgramInfoCHROMIUM(kProgramId, 6, &size, &buf);
19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), gl_->GetError());
19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearCommands();
19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // try bad bufsize
19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetProgramInfoCHROMIUM(kProgramId, -1, &size, &buf);
19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(NoCommandsWritten());
19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError());
19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearCommands();
19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // try no size ptr.
19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetProgramInfoCHROMIUM(kProgramId, sizeof(buf), NULL, &buf);
19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(NoCommandsWritten());
19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), gl_->GetError());
19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that things are cached
19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, GetIntegerCacheRead) {
19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct PNameValue {
19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum pname;
19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLint expected;
19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const PNameValue pairs[] = {
19524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      {GL_ACTIVE_TEXTURE, GL_TEXTURE0, },
19534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      {GL_TEXTURE_BINDING_2D, 0, },
19544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      {GL_TEXTURE_BINDING_CUBE_MAP, 0, },
19554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      {GL_TEXTURE_BINDING_EXTERNAL_OES, 0, },
19564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      {GL_FRAMEBUFFER_BINDING, 0, },
19574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      {GL_RENDERBUFFER_BINDING, 0, },
19584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      {GL_ARRAY_BUFFER_BINDING, 0, },
19594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      {GL_ELEMENT_ARRAY_BUFFER_BINDING, 0, },
19604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      {GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, kMaxCombinedTextureImageUnits, },
19614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      {GL_MAX_CUBE_MAP_TEXTURE_SIZE, kMaxCubeMapTextureSize, },
19624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      {GL_MAX_FRAGMENT_UNIFORM_VECTORS, kMaxFragmentUniformVectors, },
19634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      {GL_MAX_RENDERBUFFER_SIZE, kMaxRenderbufferSize, },
19644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      {GL_MAX_TEXTURE_IMAGE_UNITS, kMaxTextureImageUnits, },
19654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      {GL_MAX_TEXTURE_SIZE, kMaxTextureSize, },
19664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      {GL_MAX_VARYING_VECTORS, kMaxVaryingVectors, },
19674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      {GL_MAX_VERTEX_ATTRIBS, kMaxVertexAttribs, },
19684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      {GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, kMaxVertexTextureImageUnits, },
19694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      {GL_MAX_VERTEX_UNIFORM_VECTORS, kMaxVertexUniformVectors, },
19704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      {GL_NUM_COMPRESSED_TEXTURE_FORMATS, kNumCompressedTextureFormats, },
19714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      {GL_NUM_SHADER_BINARY_FORMATS, kNumShaderBinaryFormats, }, };
19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t num_pairs = sizeof(pairs) / sizeof(pairs[0]);
19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t ii = 0; ii < num_pairs; ++ii) {
19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PNameValue& pv = pairs[ii];
19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLint v = -1;
19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gl_->GetIntegerv(pv.pname, &v);
19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(NoCommandsWritten());
19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(pv.expected, v);
19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo result1 =
19822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExpectedResultMemory(sizeof(cmds::GetError::Result));
19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*command_buffer(), OnFlush())
19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetMemory(result1.ptr, GLuint(GL_NO_ERROR)))
19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), gl_->GetError());
19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, GetIntegerCacheWrite) {
19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct PNameValue {
19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum pname;
19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLint expected;
19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->ActiveTexture(GL_TEXTURE4);
19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->BindBuffer(GL_ARRAY_BUFFER, 2);
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->BindBuffer(GL_ELEMENT_ARRAY_BUFFER, 3);
19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->BindFramebuffer(GL_FRAMEBUFFER, 4);
19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->BindRenderbuffer(GL_RENDERBUFFER, 5);
20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->BindTexture(GL_TEXTURE_2D, 6);
20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->BindTexture(GL_TEXTURE_CUBE_MAP, 7);
20024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gl_->BindTexture(GL_TEXTURE_EXTERNAL_OES, 8);
20034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const PNameValue pairs[] = {{GL_ACTIVE_TEXTURE, GL_TEXTURE4, },
20054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                              {GL_ARRAY_BUFFER_BINDING, 2, },
20064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                              {GL_ELEMENT_ARRAY_BUFFER_BINDING, 3, },
20074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                              {GL_FRAMEBUFFER_BINDING, 4, },
20084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                              {GL_RENDERBUFFER_BINDING, 5, },
20094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                              {GL_TEXTURE_BINDING_2D, 6, },
20104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                              {GL_TEXTURE_BINDING_CUBE_MAP, 7, },
20114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                              {GL_TEXTURE_BINDING_EXTERNAL_OES, 8, }, };
20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t num_pairs = sizeof(pairs) / sizeof(pairs[0]);
20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t ii = 0; ii < num_pairs; ++ii) {
20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PNameValue& pv = pairs[ii];
20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLint v = -1;
20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gl_->GetIntegerv(pv.pname, &v);
20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(pv.expected, v);
20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo result1 =
20212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExpectedResultMemory(sizeof(cmds::GetError::Result));
20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*command_buffer(), OnFlush())
20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetMemory(result1.ptr, GLuint(GL_NO_ERROR)))
20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), gl_->GetError());
20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static bool CheckRect(
20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int width, int height, GLenum format, GLenum type, int alignment,
20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool flip_y, const uint8* r1, const uint8* r2) {
20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 size = 0;
20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 unpadded_row_size = 0;
20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 padded_row_size = 0;
20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GLES2Util::ComputeImageDataSizes(
20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      width, height, format, type, alignment, &size, &unpadded_row_size,
20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &padded_row_size)) {
20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int r2_stride = flip_y ?
20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      -static_cast<int>(padded_row_size) :
20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<int>(padded_row_size);
20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r2 = flip_y ? (r2 + (height - 1) * padded_row_size) : r2;
20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int y = 0; y < height; ++y) {
20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (memcmp(r1, r2, unpadded_row_size) != 0) {
20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r1 += padded_row_size;
20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r2 += r2_stride;
20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P8(CheckRectAction, width, height, format, type, alignment, flip_y,
20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          r1, r2) {
20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(CheckRect(
20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      width, height, format, type, alignment, flip_y, r1, r2));
20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test TexImage2D with and without flip_y
20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, TexImage2D) {
20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Cmds {
20652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::TexImage2D tex_image_2d;
20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetToken set_token;
20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Cmds2 {
20692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::TexImage2D tex_image_2d;
20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetToken set_token;
20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kTarget = GL_TEXTURE_2D;
20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kLevel = 0;
20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kFormat = GL_RGB;
20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kWidth = 3;
20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kHeight = 4;
20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kBorder = 0;
20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kType = GL_UNSIGNED_BYTE;
20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kPixelStoreUnpackAlignment = 4;
20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static uint8 pixels[] = {
20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    11, 12, 13, 13, 14, 15, 15, 16, 17, 101, 102, 103,
20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    21, 22, 23, 23, 24, 25, 25, 26, 27, 201, 202, 203,
20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    31, 32, 33, 33, 34, 35, 35, 36, 37, 123, 124, 125,
20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    41, 42, 43, 43, 44, 45, 45, 46, 47,
20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem1 = GetExpectedMemory(sizeof(pixels));
20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Cmds expected;
20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.tex_image_2d.Init(
20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kTarget, kLevel, kFormat, kWidth, kHeight, kBorder, kFormat, kType,
20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mem1.id, mem1.offset);
20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_token.Init(GetNextToken());
20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->TexImage2D(
20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kTarget, kLevel, kFormat, kWidth, kHeight, kBorder, kFormat, kType,
20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pixels);
20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(CheckRect(
20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kWidth, kHeight, kFormat, kType, kPixelStoreUnpackAlignment, false,
21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pixels, mem1.ptr));
21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearCommands();
21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->PixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, GL_TRUE);
21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem2 = GetExpectedMemory(sizeof(pixels));
21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Cmds2 expected2;
21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected2.tex_image_2d.Init(
21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kTarget, kLevel, kFormat, kWidth, kHeight, kBorder, kFormat, kType,
21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mem2.id, mem2.offset);
21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected2.set_token.Init(GetNextToken());
21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const void* commands2 = GetPut();
21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->TexImage2D(
21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kTarget, kLevel, kFormat, kWidth, kHeight, kBorder, kFormat, kType,
21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pixels);
21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(&expected2, commands2, sizeof(expected2)));
21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(CheckRect(
21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kWidth, kHeight, kFormat, kType, kPixelStoreUnpackAlignment, true,
21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pixels, mem2.ptr));
21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test TexImage2D with 2 writes
21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, TexImage2D2Writes) {
21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Cmds {
21242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::TexImage2D tex_image_2d;
21252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::TexSubImage2D tex_sub_image_2d1;
21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetToken set_token1;
21272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::TexSubImage2D tex_sub_image_2d2;
21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetToken set_token2;
21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kTarget = GL_TEXTURE_2D;
21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kLevel = 0;
21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kFormat = GL_RGB;
21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kBorder = 0;
21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kType = GL_UNSIGNED_BYTE;
21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kPixelStoreUnpackAlignment = 4;
21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kWidth = 3;
21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 size = 0;
21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 unpadded_row_size = 0;
21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 padded_row_size = 0;
21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GLES2Util::ComputeImageDataSizes(
21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kWidth, 2, kFormat, kType, kPixelStoreUnpackAlignment,
21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &size, &unpadded_row_size, &padded_row_size));
21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kHeight = (MaxTransferBufferSize() / padded_row_size) * 2;
21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GLES2Util::ComputeImageDataSizes(
21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kWidth, kHeight, kFormat, kType, kPixelStoreUnpackAlignment,
21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &size, NULL, NULL));
21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 half_size = 0;
21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GLES2Util::ComputeImageDataSizes(
21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kWidth, kHeight / 2, kFormat, kType, kPixelStoreUnpackAlignment,
21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &half_size, NULL, NULL));
21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<uint8[]> pixels(new uint8[size]);
21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (uint32 ii = 0; ii < size; ++ii) {
21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pixels[ii] = static_cast<uint8>(ii);
21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem1 = GetExpectedMemory(half_size);
21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem2 = GetExpectedMemory(half_size);
21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Cmds expected;
21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.tex_image_2d.Init(
21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kTarget, kLevel, kFormat, kWidth, kHeight, kBorder, kFormat, kType,
21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0, 0);
21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.tex_sub_image_2d1.Init(
21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kTarget, kLevel, 0, 0, kWidth, kHeight / 2, kFormat, kType,
21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mem1.id, mem1.offset, true);
21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_token1.Init(GetNextToken());
21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.tex_sub_image_2d2.Init(
21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kTarget, kLevel, 0, kHeight / 2, kWidth, kHeight / 2, kFormat, kType,
21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mem2.id, mem2.offset, true);
21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_token2.Init(GetNextToken());
21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(gman): Make it possible to run this test
21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // EXPECT_CALL(*command_buffer(), OnFlush())
21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //     .WillOnce(CheckRectAction(
21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //         kWidth, kHeight / 2, kFormat, kType, kPixelStoreUnpackAlignment,
21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //         false, pixels.get(),
21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //         GetExpectedTransferAddressFromOffsetAs<uint8>(offset1, half_size)))
21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //     .RetiresOnSaturation();
21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->TexImage2D(
21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kTarget, kLevel, kFormat, kWidth, kHeight, kBorder, kFormat, kType,
21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pixels.get());
21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(CheckRect(
21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kWidth, kHeight / 2, kFormat, kType, kPixelStoreUnpackAlignment, false,
21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pixels.get() + kHeight / 2 * padded_row_size, mem2.ptr));
21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearCommands();
21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->PixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, GL_TRUE);
21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const void* commands2 = GetPut();
21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem3 = GetExpectedMemory(half_size);
21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem4 = GetExpectedMemory(half_size);
21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.tex_image_2d.Init(
21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kTarget, kLevel, kFormat, kWidth, kHeight, kBorder, kFormat, kType,
21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0, 0);
21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.tex_sub_image_2d1.Init(
21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kTarget, kLevel, 0, kHeight / 2, kWidth, kHeight / 2, kFormat, kType,
22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mem3.id, mem3.offset, true);
22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_token1.Init(GetNextToken());
22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.tex_sub_image_2d2.Init(
22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kTarget, kLevel, 0, 0, kWidth, kHeight / 2, kFormat, kType,
22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mem4.id, mem4.offset, true);
22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_token2.Init(GetNextToken());
22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(gman): Make it possible to run this test
22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // EXPECT_CALL(*command_buffer(), OnFlush())
22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //     .WillOnce(CheckRectAction(
22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //         kWidth, kHeight / 2, kFormat, kType, kPixelStoreUnpackAlignment,
22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //         true, pixels.get(),
22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //         GetExpectedTransferAddressFromOffsetAs<uint8>(offset3, half_size)))
22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //     .RetiresOnSaturation();
22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->TexImage2D(
22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kTarget, kLevel, kFormat, kWidth, kHeight, kBorder, kFormat, kType,
22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pixels.get());
22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(&expected, commands2, sizeof(expected)));
22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(CheckRect(
22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kWidth, kHeight / 2, kFormat, kType, kPixelStoreUnpackAlignment, true,
22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pixels.get() + kHeight / 2 * padded_row_size, mem4.ptr));
22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test TexSubImage2D with GL_PACK_FLIP_Y set and partial multirow transfers
22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, TexSubImage2DFlipY) {
22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kTextureWidth = MaxTransferBufferSize() / 4;
22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kTextureHeight = 7;
22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kSubImageWidth = MaxTransferBufferSize() / 8;
22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kSubImageHeight = 4;
22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kSubImageXOffset = 1;
22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kSubImageYOffset = 2;
22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kFormat = GL_RGBA;
22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kType = GL_UNSIGNED_BYTE;
22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kTarget = GL_TEXTURE_2D;
22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kLevel = 0;
22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kBorder = 0;
22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kPixelStoreUnpackAlignment = 4;
22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Cmds {
22402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::PixelStorei pixel_store_i1;
22412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::TexImage2D tex_image_2d;
22422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::PixelStorei pixel_store_i2;
22432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::TexSubImage2D tex_sub_image_2d1;
22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetToken set_token1;
22452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::TexSubImage2D tex_sub_image_2d2;
22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetToken set_token2;
22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 sub_2_high_size = 0;
22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GLES2Util::ComputeImageDataSizes(
22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kSubImageWidth, 2, kFormat, kType, kPixelStoreUnpackAlignment,
22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &sub_2_high_size, NULL, NULL));
22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem1 = GetExpectedMemory(sub_2_high_size);
22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem2 = GetExpectedMemory(sub_2_high_size);
22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Cmds expected;
22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.pixel_store_i1.Init(GL_UNPACK_ALIGNMENT, kPixelStoreUnpackAlignment);
22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.tex_image_2d.Init(
22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kTarget, kLevel, kFormat, kTextureWidth, kTextureHeight, kBorder, kFormat,
22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kType, 0, 0);
22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.pixel_store_i2.Init(GL_UNPACK_FLIP_Y_CHROMIUM, GL_TRUE);
22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.tex_sub_image_2d1.Init(kTarget, kLevel, kSubImageXOffset,
22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kSubImageYOffset + 2, kSubImageWidth, 2, kFormat, kType,
22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mem1.id, mem1.offset, false);
22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_token1.Init(GetNextToken());
22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.tex_sub_image_2d2.Init(kTarget, kLevel, kSubImageXOffset,
22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kSubImageYOffset, kSubImageWidth , 2, kFormat, kType,
22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mem2.id, mem2.offset, false);
22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_token2.Init(GetNextToken());
22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->PixelStorei(GL_UNPACK_ALIGNMENT, kPixelStoreUnpackAlignment);
22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->TexImage2D(
22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kTarget, kLevel, kFormat, kTextureWidth, kTextureHeight, kBorder, kFormat,
22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kType, NULL);
22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->PixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, GL_TRUE);
2277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<uint32[]> pixels(new uint32[kSubImageWidth * kSubImageHeight]);
22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int y = 0; y < kSubImageHeight; ++y) {
22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int x = 0; x < kSubImageWidth; ++x) {
22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pixels.get()[kSubImageWidth * y + x] = x | (y << 16);
22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->TexSubImage2D(
22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_TEXTURE_2D, 0, kSubImageXOffset, kSubImageYOffset, kSubImageWidth,
22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kSubImageHeight, GL_RGBA, GL_UNSIGNED_BYTE, pixels.get());
22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(CheckRect(
22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kSubImageWidth, 2, kFormat, kType, kPixelStoreUnpackAlignment, true,
22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<uint8*>(pixels.get() + 2 * kSubImageWidth),
22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mem2.ptr));
22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, SubImageUnpack) {
22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint unpack_alignments[] = { 1, 2, 4, 8 };
22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLenum kFormat = GL_RGB;
22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLenum kType = GL_UNSIGNED_BYTE;
22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kLevel = 0;
23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kBorder = 0;
23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We're testing using the unpack params to pull a subimage out of a larger
23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // source of pixels. Here we specify the subimage by its border rows /
23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // columns.
23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kSrcWidth = 33;
23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kSrcSubImageX0 = 11;
23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kSrcSubImageX1 = 20;
23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kSrcSubImageY0 = 18;
23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kSrcSubImageY1 = 23;
23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kSrcSubImageWidth = kSrcSubImageX1 - kSrcSubImageX0;
23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kSrcSubImageHeight = kSrcSubImageY1 - kSrcSubImageY0;
23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // these are only used in the texsubimage tests
23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kTexWidth = 1023;
23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kTexHeight = 511;
23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kTexSubXOffset = 419;
23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kTexSubYOffset = 103;
23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct {
23192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::PixelStorei pixel_store_i;
23202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::PixelStorei pixel_store_i2;
23212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::TexImage2D tex_image_2d;
23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } texImageExpected;
23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct  {
23252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::PixelStorei pixel_store_i;
23262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::PixelStorei pixel_store_i2;
23272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::TexImage2D tex_image_2d;
23282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::TexSubImage2D tex_sub_image_2d;
23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } texSubImageExpected;
23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 src_size;
23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GLES2Util::ComputeImageDataSizes(
23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kSrcWidth, kSrcSubImageY1, kFormat, kType, 8, &src_size, NULL, NULL));
2334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<uint8[]> src_pixels;
23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  src_pixels.reset(new uint8[src_size]);
23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < src_size; ++i) {
23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    src_pixels[i] = static_cast<int8>(i);
23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int sub = 0; sub < 2; ++sub) {
23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int flip_y = 0; flip_y < 2; ++flip_y) {
23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (size_t a = 0; a < arraysize(unpack_alignments); ++a) {
23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GLint alignment = unpack_alignments[a];
23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        uint32 size;
23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        uint32 unpadded_row_size;
23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        uint32 padded_row_size;
23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ASSERT_TRUE(GLES2Util::ComputeImageDataSizes(
23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            kSrcSubImageWidth, kSrcSubImageHeight, kFormat, kType, alignment,
23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            &size, &unpadded_row_size, &padded_row_size));
23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ASSERT_TRUE(size <= MaxTransferBufferSize());
23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ExpectedMemoryInfo mem = GetExpectedMemory(size);
23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const void* commands = GetPut();
23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        gl_->PixelStorei(GL_UNPACK_ALIGNMENT, alignment);
23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        gl_->PixelStorei(GL_UNPACK_ROW_LENGTH, kSrcWidth);
23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        gl_->PixelStorei(GL_UNPACK_SKIP_PIXELS, kSrcSubImageX0);
23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        gl_->PixelStorei(GL_UNPACK_SKIP_ROWS, kSrcSubImageY0);
23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        gl_->PixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, flip_y);
23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (sub) {
23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          gl_->TexImage2D(
23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              GL_TEXTURE_2D, kLevel, kFormat, kTexWidth, kTexHeight, kBorder,
23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kFormat, kType, NULL);
23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          gl_->TexSubImage2D(
23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              GL_TEXTURE_2D, kLevel, kTexSubXOffset, kTexSubYOffset,
23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kSrcSubImageWidth, kSrcSubImageHeight, kFormat, kType,
23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              src_pixels.get());
23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          texSubImageExpected.pixel_store_i.Init(
23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              GL_UNPACK_ALIGNMENT, alignment);
23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          texSubImageExpected.pixel_store_i2.Init(
23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              GL_UNPACK_FLIP_Y_CHROMIUM, flip_y);
23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          texSubImageExpected.tex_image_2d.Init(
23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              GL_TEXTURE_2D, kLevel, kFormat, kTexWidth, kTexHeight, kBorder,
23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kFormat, kType, 0, 0);
23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          texSubImageExpected.tex_sub_image_2d.Init(
23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              GL_TEXTURE_2D, kLevel, kTexSubXOffset, kTexSubYOffset,
23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kSrcSubImageWidth, kSrcSubImageHeight, kFormat, kType, mem.id,
23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              mem.offset, GL_FALSE);
23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          EXPECT_EQ(0, memcmp(
23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              &texSubImageExpected, commands, sizeof(texSubImageExpected)));
23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else {
23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          gl_->TexImage2D(
23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              GL_TEXTURE_2D, kLevel, kFormat,
23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kSrcSubImageWidth, kSrcSubImageHeight, kBorder, kFormat, kType,
23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              src_pixels.get());
23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          texImageExpected.pixel_store_i.Init(GL_UNPACK_ALIGNMENT, alignment);
23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          texImageExpected.pixel_store_i2.Init(
23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              GL_UNPACK_FLIP_Y_CHROMIUM, flip_y);
23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          texImageExpected.tex_image_2d.Init(
23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              GL_TEXTURE_2D, kLevel, kFormat, kSrcSubImageWidth,
23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kSrcSubImageHeight, kBorder, kFormat, kType, mem.id, mem.offset);
23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          EXPECT_EQ(0, memcmp(
23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              &texImageExpected, commands, sizeof(texImageExpected)));
23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        uint32 src_padded_row_size;
23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ASSERT_TRUE(GLES2Util::ComputeImagePaddedRowSize(
23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            kSrcWidth, kFormat, kType, alignment, &src_padded_row_size));
23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        uint32 bytes_per_group = GLES2Util::ComputeImageGroupSize(
23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            kFormat, kType);
23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for (int y = 0; y < kSrcSubImageHeight; ++y) {
24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GLint src_sub_y = flip_y ? kSrcSubImageHeight - y - 1 : y;
24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          const uint8* src_row = src_pixels.get() +
24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              (kSrcSubImageY0 + src_sub_y) * src_padded_row_size +
24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              bytes_per_group * kSrcSubImageX0;
24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          const uint8* dst_row = mem.ptr + y * padded_row_size;
24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          EXPECT_EQ(0, memcmp(src_row, dst_row, unpadded_row_size));
24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ClearCommands();
24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Binds can not be cached with bind_generates_resource = false because
24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// our id might not be valid. More specifically if you bind on contextA then
24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// delete on contextB the resource is still bound on contextA but GetInterger
24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// won't return an id.
24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationStrictSharedTest, BindsNotCached) {
24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct PNameValue {
24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum pname;
24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLint expected;
24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
24224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const PNameValue pairs[] = {{GL_TEXTURE_BINDING_2D, 1, },
24234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                              {GL_TEXTURE_BINDING_CUBE_MAP, 2, },
24244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                              {GL_TEXTURE_BINDING_EXTERNAL_OES, 3, },
24254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                              {GL_FRAMEBUFFER_BINDING, 4, },
24264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                              {GL_RENDERBUFFER_BINDING, 5, },
24274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                              {GL_ARRAY_BUFFER_BINDING, 6, },
24284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                              {GL_ELEMENT_ARRAY_BUFFER_BINDING, 7, }, };
24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t num_pairs = sizeof(pairs) / sizeof(pairs[0]);
24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t ii = 0; ii < num_pairs; ++ii) {
24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PNameValue& pv = pairs[ii];
24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLint v = -1;
24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectedMemoryInfo result1 =
24342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        GetExpectedResultMemory(sizeof(cmds::GetIntegerv::Result));
24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*command_buffer(), OnFlush())
24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillOnce(SetMemory(result1.ptr,
24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            SizedResultHelper<GLuint>(pv.expected)))
24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gl_->GetIntegerv(pv.pname, &v);
24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(pv.expected, v);
24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, CreateStreamTextureCHROMIUM) {
24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kTextureId = 123;
24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kResult = 456;
24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Cmds {
24492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::CreateStreamTextureCHROMIUM create_stream;
24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo result1 =
24532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExpectedResultMemory(
24542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          sizeof(cmds::CreateStreamTextureCHROMIUM::Result));
24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo result2 =
24562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExpectedResultMemory(sizeof(cmds::GetError::Result));
24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Cmds expected;
24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.create_stream.Init(kTextureId, result1.id, result1.offset);
24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*command_buffer(), OnFlush())
24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetMemory(result1.ptr, kResult))
24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetMemory(result2.ptr, GLuint(GL_NO_ERROR)))
24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint handle = gl_->CreateStreamTextureCHROMIUM(kTextureId);
24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(handle, kResult);
24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), gl_->GetError());
24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, GetString) {
24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 kBucketId = GLES2Implementation::kResultBucketId;
24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Str7 kString = {"foobar"};
24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GL_CHROMIUM_map_sub GL_CHROMIUM_flipy are hard coded into
24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GLES2Implementation.
24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* expected_str =
24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "foobar "
24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "GL_CHROMIUM_flipy "
24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "GL_CHROMIUM_map_sub "
24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "GL_CHROMIUM_shallow_flush "
24823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      "GL_EXT_unpack_subimage "
24833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      "GL_CHROMIUM_map_image";
24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kBad = 0x12;
24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Cmds {
24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetBucketSize set_bucket_size1;
24872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::GetString get_string;
24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::GetBucketStart get_bucket_start;
24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetToken set_token1;
24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetBucketSize set_bucket_size2;
24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem1 = GetExpectedMemory(MaxTransferBufferSize());
24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo result1 =
24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetExpectedResultMemory(sizeof(cmd::GetBucketStart::Result));
24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Cmds expected;
24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_bucket_size1.Init(kBucketId, 0);
24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.get_string.Init(GL_EXTENSIONS, kBucketId);
24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.get_bucket_start.Init(
24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kBucketId, result1.id, result1.offset,
25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MaxTransferBufferSize(), mem1.id, mem1.offset);
25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_token1.Init(GetNextToken());
25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_bucket_size2.Init(kBucketId, 0);
25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char buf[sizeof(kString) + 1];
25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(buf, kBad, sizeof(buf));
25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(*gpu_control_.get(), SupportsGpuMemoryBuffer())
25074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(true));
25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*command_buffer(), OnFlush())
25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(DoAll(SetMemory(result1.ptr, uint32(sizeof(kString))),
25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      SetMemory(mem1.ptr, kString)))
25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLubyte* result = gl_->GetString(GL_EXTENSIONS);
25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(expected_str, reinterpret_cast<const char*>(result));
25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, PixelStoreiGLPackReverseRowOrderANGLE) {
25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 kBucketId = GLES2Implementation::kResultBucketId;
25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Str7 kString = {"foobar"};
25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Cmds {
25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetBucketSize set_bucket_size1;
25232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::GetString get_string;
25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::GetBucketStart get_bucket_start;
25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetToken set_token1;
25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetBucketSize set_bucket_size2;
25272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::PixelStorei pixel_store;
25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem1 = GetExpectedMemory(MaxTransferBufferSize());
25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo result1 =
25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetExpectedResultMemory(sizeof(cmd::GetBucketStart::Result));
25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Cmds expected;
25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_bucket_size1.Init(kBucketId, 0);
25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.get_string.Init(GL_EXTENSIONS, kBucketId);
25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.get_bucket_start.Init(
25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kBucketId, result1.id, result1.offset,
25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MaxTransferBufferSize(), mem1.id, mem1.offset);
25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_token1.Init(GetNextToken());
25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_bucket_size2.Init(kBucketId, 0);
25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.pixel_store.Init(GL_PACK_REVERSE_ROW_ORDER_ANGLE, 1);
25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(*gpu_control_.get(), SupportsGpuMemoryBuffer())
25454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(false));
25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*command_buffer(), OnFlush())
25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(DoAll(SetMemory(result1.ptr, uint32(sizeof(kString))),
25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      SetMemory(mem1.ptr, kString)))
25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->PixelStorei(GL_PACK_REVERSE_ROW_ORDER_ANGLE, 1);
25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, CreateProgram) {
25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Cmds {
25572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::CreateProgram cmd;
25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Cmds expected;
25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.cmd.Init(kProgramsAndShadersStartId);
25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint id = gl_->CreateProgram();
25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kProgramsAndShadersStartId, id);
25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, BufferDataLargerThanTransferBuffer) {
25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Cmds {
25692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BufferData set_size;
25702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BufferSubData copy_data1;
25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetToken set_token1;
25722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BufferSubData copy_data2;
25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetToken set_token2;
25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const unsigned kUsableSize =
25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kTransferBufferSize - GLES2Implementation::kStartingOffset;
25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint8 buf[kUsableSize * 2] = { 0, };
25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem1 = GetExpectedMemory(kUsableSize);
25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo mem2 = GetExpectedMemory(kUsableSize);
25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Cmds expected;
25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_size.Init(
25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_ARRAY_BUFFER, arraysize(buf), 0, 0, GL_DYNAMIC_DRAW);
25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.copy_data1.Init(
25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_ARRAY_BUFFER, 0, kUsableSize, mem1.id, mem1.offset);
25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_token1.Init(GetNextToken());
25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.copy_data2.Init(
25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_ARRAY_BUFFER, kUsableSize, kUsableSize, mem2.id, mem2.offset);
25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.set_token2.Init(GetNextToken());
25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->BufferData(GL_ARRAY_BUFFER, arraysize(buf), buf, GL_DYNAMIC_DRAW);
25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, CapabilitiesAreCached) {
25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLenum kStates[] = {
25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GL_DITHER,
25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GL_BLEND,
25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GL_CULL_FACE,
26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GL_DEPTH_TEST,
26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GL_POLYGON_OFFSET_FILL,
26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GL_SAMPLE_ALPHA_TO_COVERAGE,
26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GL_SAMPLE_COVERAGE,
26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GL_SCISSOR_TEST,
26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GL_STENCIL_TEST,
26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Cmds {
26082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::Enable enable_cmd;
26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Cmds expected;
26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t ii = 0; ii < arraysize(kStates); ++ii) {
26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum state = kStates[ii];
26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected.enable_cmd.Init(state);
26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLboolean result = gl_->IsEnabled(state);
26162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(static_cast<GLboolean>(ii == 0), result);
26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(NoCommandsWritten());
26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const void* commands = GetPut();
26192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!result) {
26202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gl_->Enable(state);
26212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_EQ(0, memcmp(&expected, commands, sizeof(expected)));
26222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClearCommands();
26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result = gl_->IsEnabled(state);
26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(result);
26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(NoCommandsWritten());
26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(GLES2ImplementationTest, BindVertexArrayOES) {
26312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLuint id = 0;
26322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gl_->GenVertexArraysOES(1, &id);
26332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ClearCommands();
26342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  struct Cmds {
26362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BindVertexArrayOES cmd;
26372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
26382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Cmds expected;
26392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected.cmd.Init(id);
26402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const void* commands = GetPut();
26422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gl_->BindVertexArrayOES(id);
26432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, memcmp(&expected, commands, sizeof(expected)));
26442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ClearCommands();
26452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gl_->BindVertexArrayOES(id);
26462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(NoCommandsWritten());
26472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
26482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, BeginEndQueryEXT) {
26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test GetQueryivEXT returns 0 if no current query.
26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint param = -1;
26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetQueryivEXT(GL_ANY_SAMPLES_PASSED_EXT, GL_CURRENT_QUERY_EXT, &param);
26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, param);
26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint expected_ids[2] = { 1, 2 }; // These must match what's actually genned.
26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct GenCmds {
26572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::GenQueriesEXTImmediate gen;
26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint data[2];
26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GenCmds expected_gen_cmds;
26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_gen_cmds.gen.Init(arraysize(expected_ids), &expected_ids[0]);
26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint ids[arraysize(expected_ids)] = { 0, };
26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GenQueriesEXT(arraysize(expected_ids), &ids[0]);
26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(
26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &expected_gen_cmds, commands_, sizeof(expected_gen_cmds)));
26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint id1 = ids[0];
26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint id2 = ids[1];
26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearCommands();
26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test BeginQueryEXT fails if id = 0.
26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->BeginQueryEXT(GL_ANY_SAMPLES_PASSED_EXT, 0);
26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(NoCommandsWritten());
26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_INVALID_OPERATION, CheckError());
26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test BeginQueryEXT fails if id not GENed.
26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(gman):
26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test BeginQueryEXT inserts command.
26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct BeginCmds {
26802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BeginQueryEXT begin_query;
26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BeginCmds expected_begin_cmds;
26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const void* commands = GetPut();
26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->BeginQueryEXT(GL_ANY_SAMPLES_PASSED_EXT, id1);
26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QueryTracker::Query* query = GetQuery(id1);
26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(query != NULL);
26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_begin_cmds.begin_query.Init(
26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_ANY_SAMPLES_PASSED_EXT, id1, query->shm_id(), query->shm_offset());
26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(
26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &expected_begin_cmds, commands, sizeof(expected_begin_cmds)));
26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearCommands();
26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test GetQueryivEXT returns id.
26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  param = -1;
26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetQueryivEXT(GL_ANY_SAMPLES_PASSED_EXT, GL_CURRENT_QUERY_EXT, &param);
26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(id1, static_cast<GLuint>(param));
26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetQueryivEXT(
26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT, GL_CURRENT_QUERY_EXT, &param);
26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, param);
27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test BeginQueryEXT fails if between Begin/End.
27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->BeginQueryEXT(GL_ANY_SAMPLES_PASSED_EXT, id2);
27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(NoCommandsWritten());
27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_INVALID_OPERATION, CheckError());
27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test EndQueryEXT fails if target not same as current query.
27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearCommands();
27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->EndQueryEXT(GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT);
27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(NoCommandsWritten());
27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_INVALID_OPERATION, CheckError());
27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test EndQueryEXT sends command
27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct EndCmds {
27142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::EndQueryEXT end_query;
27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EndCmds expected_end_cmds;
27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_end_cmds.end_query.Init(
27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_ANY_SAMPLES_PASSED_EXT, query->submit_count());
27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  commands = GetPut();
27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->EndQueryEXT(GL_ANY_SAMPLES_PASSED_EXT);
27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(
27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &expected_end_cmds, commands, sizeof(expected_end_cmds)));
27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test EndQueryEXT fails if no current query.
27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearCommands();
27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->EndQueryEXT(GL_ANY_SAMPLES_PASSED_EXT);
27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(NoCommandsWritten());
27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_INVALID_OPERATION, CheckError());
27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test 2nd Begin/End increments count.
27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 old_submit_count = query->submit_count();
27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->BeginQueryEXT(GL_ANY_SAMPLES_PASSED_EXT, id1);
27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(old_submit_count, query->submit_count());
27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_end_cmds.end_query.Init(
27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_ANY_SAMPLES_PASSED_EXT, query->submit_count());
27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  commands = GetPut();
27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->EndQueryEXT(GL_ANY_SAMPLES_PASSED_EXT);
27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(
27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &expected_end_cmds, commands, sizeof(expected_end_cmds)));
27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test BeginQueryEXT fails if target changed.
27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearCommands();
27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->BeginQueryEXT(GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT, id1);
27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(NoCommandsWritten());
27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_INVALID_OPERATION, CheckError());
27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test GetQueryObjectuivEXT fails if unused id
27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint available = 0xBDu;
27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearCommands();
27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetQueryObjectuivEXT(id2, GL_QUERY_RESULT_AVAILABLE_EXT, &available);
27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(NoCommandsWritten());
27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0xBDu, available);
27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_INVALID_OPERATION, CheckError());
27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test GetQueryObjectuivEXT fails if bad id
27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearCommands();
27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetQueryObjectuivEXT(4567, GL_QUERY_RESULT_AVAILABLE_EXT, &available);
27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(NoCommandsWritten());
27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0xBDu, available);
27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_INVALID_OPERATION, CheckError());
27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test GetQueryObjectuivEXT CheckResultsAvailable
27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearCommands();
27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetQueryObjectuivEXT(id1, GL_QUERY_RESULT_AVAILABLE_EXT, &available);
27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(NoCommandsWritten());
27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, available);
27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, ErrorQuery) {
27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint id = 0;
27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GenQueriesEXT(1, &id);
27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearCommands();
27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test BeginQueryEXT does NOT insert commands.
27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->BeginQueryEXT(GL_GET_ERROR_QUERY_CHROMIUM, id);
27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(NoCommandsWritten());
27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QueryTracker::Query* query = GetQuery(id);
27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(query != NULL);
27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test EndQueryEXT sends both begin and end command
27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct EndCmds {
27822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::BeginQueryEXT begin_query;
27832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::EndQueryEXT end_query;
27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EndCmds expected_end_cmds;
27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_end_cmds.begin_query.Init(
27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_GET_ERROR_QUERY_CHROMIUM, id, query->shm_id(), query->shm_offset());
27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_end_cmds.end_query.Init(
27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_GET_ERROR_QUERY_CHROMIUM, query->submit_count());
27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const void* commands = GetPut();
27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->EndQueryEXT(GL_GET_ERROR_QUERY_CHROMIUM);
27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(
27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &expected_end_cmds, commands, sizeof(expected_end_cmds)));
27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearCommands();
27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check result is not yet available.
27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint available = 0xBDu;
27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetQueryObjectuivEXT(id, GL_QUERY_RESULT_AVAILABLE_EXT, &available);
27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(NoCommandsWritten());
28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, available);
28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test no commands are sent if there is a client side error.
28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Generate a client side error
28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->ActiveTexture(GL_TEXTURE0 - 1);
28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->BeginQueryEXT(GL_GET_ERROR_QUERY_CHROMIUM, id);
28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->EndQueryEXT(GL_GET_ERROR_QUERY_CHROMIUM);
28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(NoCommandsWritten());
28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check result is available.
28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetQueryObjectuivEXT(id, GL_QUERY_RESULT_AVAILABLE_EXT, &available);
28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(NoCommandsWritten());
28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(0u, available);
28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check result.
28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint result = 0xBDu;
28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GetQueryObjectuivEXT(id, GL_QUERY_RESULT_EXT, &result);
28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(NoCommandsWritten());
28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLuint>(GL_INVALID_ENUM), result);
28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, VertexArrays) {
28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kAttribIndex1 = 1;
28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kNumComponents1 = 3;
28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kClientStride = 12;
28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint id = 0;
28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->GenVertexArraysOES(1, &id);
28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearCommands();
28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->BindVertexArrayOES(id);
28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that VertexAttribPointer cannot be called with a bound buffer of 0
28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // unless the offset is NULL
28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->BindBuffer(GL_ARRAY_BUFFER, 0);
28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->VertexAttribPointer(
28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kAttribIndex1, kNumComponents1, GL_FLOAT, GL_FALSE, kClientStride,
28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<const void*>(4));
28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_INVALID_OPERATION, CheckError());
28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->VertexAttribPointer(
28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kAttribIndex1, kNumComponents1, GL_FLOAT, GL_FALSE, kClientStride, NULL);
28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, CheckError());
28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(GLES2ImplementationTest, Disable) {
28512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  struct Cmds {
28522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::Disable cmd;
28532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
28542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Cmds expected;
28552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected.cmd.Init(GL_DITHER);  // Note: DITHER defaults to enabled.
28562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gl_->Disable(GL_DITHER);
28582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
28592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check it's cached and not called again.
28602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ClearCommands();
28612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gl_->Disable(GL_DITHER);
28622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(NoCommandsWritten());
28632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
28642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(GLES2ImplementationTest, Enable) {
28662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  struct Cmds {
28672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::Enable cmd;
28682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
28692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Cmds expected;
28702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected.cmd.Init(GL_BLEND);  // Note: BLEND defaults to disabled.
28712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gl_->Enable(GL_BLEND);
28732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
28742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check it's cached and not called again.
28752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ClearCommands();
28762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gl_->Enable(GL_BLEND);
28772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(NoCommandsWritten());
28782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
28792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/client/gles2_implementation_unittest_autogen.h"
28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gles2
28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gpu
2885