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)#include "gpu/command_buffer/service/common_decoder.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/cmd_buffer_engine.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu {
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(CommonDecoderBucket, Basic) {
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommonDecoder::Bucket bucket;
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, bucket.size());
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(NULL == bucket.GetData(0, 0));
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(CommonDecoderBucket, Size) {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommonDecoder::Bucket bucket;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bucket.SetSize(24);
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(24u, bucket.size());
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bucket.SetSize(12);
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(12u, bucket.size());
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(CommonDecoderBucket, GetData) {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommonDecoder::Bucket bucket;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bucket.SetSize(24);
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(NULL != bucket.GetData(0, 0));
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(NULL != bucket.GetData(24, 0));
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(NULL == bucket.GetData(25, 0));
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(NULL != bucket.GetData(0, 24));
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(NULL == bucket.GetData(0, 25));
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bucket.SetSize(23);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(NULL == bucket.GetData(0, 24));
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(CommonDecoderBucket, SetData) {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommonDecoder::Bucket bucket;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char data[] = "testing";
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bucket.SetSize(10);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(bucket.SetData(data, 0, sizeof(data)));
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(data, bucket.GetData(0, sizeof(data)), sizeof(data)));
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(bucket.SetData(data, 2, sizeof(data)));
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(data, bucket.GetData(2, sizeof(data)), sizeof(data)));
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(bucket.SetData(data, 0, sizeof(data) * 2));
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(bucket.SetData(data, 5, sizeof(data)));
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestCommonDecoder : public CommonDecoder {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from AsyncAPIInterface
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual const char* GetCommandName(unsigned int command_id) const OVERRIDE {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return GetCommonCommandName(static_cast<cmd::CommandId>(command_id));
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from AsyncAPIInterface
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual error::Error DoCommand(
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unsigned int command,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unsigned int arg_count,
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const void* cmd_data) OVERRIDE {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return DoCommonCommand(command, arg_count, cmd_data);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommonDecoder::Bucket* GetBucket(uint32 id) const {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return CommonDecoder::GetBucket(id);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockCommandBufferEngine : public CommandBufferEngine {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int32 kStartValidShmId = 1;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int32 kValidShmId = 2;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int32 kInvalidShmId = 3;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const size_t kBufferSize = 1024;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int32 kValidOffset = kBufferSize / 2;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int32 kInvalidOffset = kBufferSize;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockCommandBufferEngine()
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : CommandBufferEngine(),
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        token_(),
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        get_offset_(0) {
84effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    scoped_ptr<base::SharedMemory> shared_memory(new base::SharedMemory());
85effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    shared_memory->CreateAndMapAnonymous(kBufferSize);
86e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    buffer_ = MakeBufferFromSharedMemory(shared_memory.Pass(), kBufferSize);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from CommandBufferEngine.
90effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual scoped_refptr<gpu::Buffer> GetSharedMemoryBuffer(int32 shm_id)
91effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      OVERRIDE {
92effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (IsValidSharedMemoryId(shm_id))
93effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      return buffer_;
94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return NULL;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template <typename T>
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  T GetSharedMemoryAs(uint32 offset) {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK_LT(offset, kBufferSize);
100effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    int8* buffer_memory = static_cast<int8*>(buffer_->memory());
101effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return reinterpret_cast<T>(&buffer_memory[offset]);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32 GetSharedMemoryOffset(const void* memory) {
105effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    int8* buffer_memory = static_cast<int8*>(buffer_->memory());
106effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    ptrdiff_t offset = static_cast<const int8*>(memory) - &buffer_memory[0];
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK_GE(offset, 0);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK_LT(static_cast<size_t>(offset), kBufferSize);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return static_cast<int32>(offset);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from CommandBufferEngine.
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void set_token(int32 token) OVERRIDE {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    token_ = token;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32 token() const {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return token_;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from CommandBufferEngine.
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool SetGetBuffer(int32 transfer_buffer_id) OVERRIDE {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from CommandBufferEngine.
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool SetGetOffset(int32 offset) OVERRIDE {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (static_cast<size_t>(offset) < kBufferSize) {
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      get_offset_ = offset;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from CommandBufferEngine.
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual int32 GetGetOffset() OVERRIDE {
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return get_offset_;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsValidSharedMemoryId(int32 shm_id) {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return shm_id == kValidShmId || shm_id == kStartValidShmId;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
146effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_refptr<gpu::Buffer> buffer_;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32 token_;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32 get_offset_;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 MockCommandBufferEngine::kStartValidShmId;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 MockCommandBufferEngine::kValidShmId;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 MockCommandBufferEngine::kInvalidShmId;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const size_t MockCommandBufferEngine::kBufferSize;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 MockCommandBufferEngine::kValidOffset;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 MockCommandBufferEngine::kInvalidOffset;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CommonDecoderTest : public testing::Test {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    decoder_.set_engine(&engine_);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template <typename T>
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error::Error ExecuteCmd(const T& cmd) {
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    COMPILE_ASSERT(T::kArgFlags == cmd::kFixed, Cmd_kArgFlags_not_kFixed);
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return decoder_.DoCommands(
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        1, (const void*)&cmd, ComputeNumEntries(sizeof(cmd)), 0);
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template <typename T>
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error::Error ExecuteImmediateCmd(const T& cmd, size_t data_size) {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    COMPILE_ASSERT(T::kArgFlags == cmd::kAtLeastN, Cmd_kArgFlags_not_kAtLeastN);
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return decoder_.DoCommands(
1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        1, (const void*)&cmd, ComputeNumEntries(sizeof(cmd) + data_size), 0);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockCommandBufferEngine engine_;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestCommonDecoder decoder_;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CommonDecoderTest, Initialize) {
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, engine_.GetGetOffset());
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(CommonDecoderTest, DoCommonCommandInvalidCommand) {
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(error::kUnknownCommand, decoder_.DoCommand(999999, 0, NULL));
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CommonDecoderTest, HandleNoop) {
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd::Noop cmd;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 kSkipCount = 5;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(kSkipCount);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError,
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ExecuteImmediateCmd(
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                cmd, kSkipCount * kCommandBufferEntrySize));
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 kSkipCount2 = 1;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(kSkipCount2);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError,
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ExecuteImmediateCmd(
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                cmd, kSkipCount2 * kCommandBufferEntrySize));
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CommonDecoderTest, SetToken) {
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd::SetToken cmd;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int32 kTokenId = 123;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, engine_.token());
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(kTokenId);
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kTokenId, engine_.token());
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CommonDecoderTest, SetBucketSize) {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd::SetBucketSize cmd;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 kBucketId = 123;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 kBucketLength1 = 1234;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 kBucketLength2 = 78;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the bucket does not exist.
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(NULL == decoder_.GetBucket(kBucketId));
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can create one.
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(kBucketId, kBucketLength1);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommonDecoder::Bucket* bucket;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bucket = decoder_.GetBucket(kBucketId);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(NULL != bucket);
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kBucketLength1, bucket->size());
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can change it.
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(kBucketId, kBucketLength2);
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bucket = decoder_.GetBucket(kBucketId);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(NULL != bucket);
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kBucketLength2, bucket->size());
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can delete it.
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(kBucketId, 0);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bucket = decoder_.GetBucket(kBucketId);
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, bucket->size());
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CommonDecoderTest, SetBucketData) {
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd::SetBucketSize size_cmd;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd::SetBucketData cmd;
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char kData[] = "1234567890123456789";
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 kBucketId = 123;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 kInvalidBucketId = 124;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_cmd.Init(kBucketId, sizeof(kData));
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(size_cmd));
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommonDecoder::Bucket* bucket = decoder_.GetBucket(kBucketId);
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the data is not there.
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(0, memcmp(bucket->GetData(0, sizeof(kData)), kData, sizeof(kData)));
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can set it.
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 kSomeOffsetInSharedMemory = 50;
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* memory = engine_.GetSharedMemoryAs<void*>(kSomeOffsetInSharedMemory);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(memory, kData, sizeof(kData));
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(kBucketId, 0, sizeof(kData),
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(bucket->GetData(0, sizeof(kData)), kData, sizeof(kData)));
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can set it partially.
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char kData2[] = "ABCEDFG";
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 kSomeOffsetInBucket = 5;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(memory, kData2, sizeof(kData2));
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(kBucketId, kSomeOffsetInBucket, sizeof(kData2),
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory);
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(bucket->GetData(kSomeOffsetInBucket, sizeof(kData2)),
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      kData2, sizeof(kData2)));
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* bucket_data = bucket->GetDataAs<const char*>(0, sizeof(kData));
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that nothing was affected outside of updated area.
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kData[kSomeOffsetInBucket - 1],
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            bucket_data[kSomeOffsetInBucket - 1]);
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kData[kSomeOffsetInBucket + sizeof(kData2)],
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            bucket_data[kSomeOffsetInBucket + sizeof(kData2)]);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that it fails if the bucket_id is invalid
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(kInvalidBucketId, kSomeOffsetInBucket, sizeof(kData2),
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory);
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that it fails if the offset is out of range.
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(kBucketId, bucket->size(), 1,
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that it fails if the size is out of range.
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(kBucketId, 0, bucket->size() + 1,
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory);
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CommonDecoderTest, SetBucketDataImmediate) {
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd::SetBucketSize size_cmd;
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int8 buffer[1024];
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd::SetBucketDataImmediate& cmd =
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *reinterpret_cast<cmd::SetBucketDataImmediate*>(&buffer);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char kData[] = "1234567890123456789";
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 kBucketId = 123;
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 kInvalidBucketId = 124;
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_cmd.Init(kBucketId, sizeof(kData));
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(size_cmd));
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommonDecoder::Bucket* bucket = decoder_.GetBucket(kBucketId);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the data is not there.
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(0, memcmp(bucket->GetData(0, sizeof(kData)), kData, sizeof(kData)));
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can set it.
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* memory = &buffer[0] + sizeof(cmd);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(memory, kData, sizeof(kData));
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(kBucketId, 0, sizeof(kData));
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError,
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ExecuteImmediateCmd(cmd, sizeof(kData)));
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(bucket->GetData(0, sizeof(kData)), kData, sizeof(kData)));
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can set it partially.
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char kData2[] = "ABCEDFG";
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 kSomeOffsetInBucket = 5;
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(memory, kData2, sizeof(kData2));
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(kBucketId, kSomeOffsetInBucket, sizeof(kData2));
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError,
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ExecuteImmediateCmd(cmd, sizeof(kData2)));
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(bucket->GetData(kSomeOffsetInBucket, sizeof(kData2)),
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      kData2, sizeof(kData2)));
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* bucket_data = bucket->GetDataAs<const char*>(0, sizeof(kData));
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that nothing was affected outside of updated area.
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kData[kSomeOffsetInBucket - 1],
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            bucket_data[kSomeOffsetInBucket - 1]);
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kData[kSomeOffsetInBucket + sizeof(kData2)],
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            bucket_data[kSomeOffsetInBucket + sizeof(kData2)]);
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that it fails if the bucket_id is invalid
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(kInvalidBucketId, kSomeOffsetInBucket, sizeof(kData2));
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(error::kNoError,
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ExecuteImmediateCmd(cmd, sizeof(kData2)));
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that it fails if the offset is out of range.
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(kBucketId, bucket->size(), 1);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(error::kNoError,
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ExecuteImmediateCmd(cmd, sizeof(kData2)));
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that it fails if the size is out of range.
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(kBucketId, 0, bucket->size() + 1);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(error::kNoError,
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ExecuteImmediateCmd(cmd, sizeof(kData2)));
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CommonDecoderTest, GetBucketStart) {
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd::SetBucketSize size_cmd;
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd::SetBucketData set_cmd;
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd::GetBucketStart cmd;
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char kData[] = "1234567890123456789";
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char zero[sizeof(kData)] = { 0, };
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 kBucketSize = sizeof(kData);
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 kBucketId = 123;
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 kInvalidBucketId = 124;
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Put data in the bucket.
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_cmd.Init(kBucketId, sizeof(kData));
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(size_cmd));
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 kSomeOffsetInSharedMemory = 50;
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint8* start = engine_.GetSharedMemoryAs<uint8*>(kSomeOffsetInSharedMemory);
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(start, kData, sizeof(kData));
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_cmd.Init(kBucketId, 0, sizeof(kData),
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory);
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(set_cmd));
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the size is correct with no data buffer.
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32* memory =
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      engine_.GetSharedMemoryAs<uint32*>(kSomeOffsetInSharedMemory);
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *memory = 0x0;
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(kBucketId,
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory,
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           0, 0, 0);
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kBucketSize, *memory);
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the data is copied with data buffer.
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 kDataOffsetInSharedMemory = 54;
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint8* data = engine_.GetSharedMemoryAs<uint8*>(kDataOffsetInSharedMemory);
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *memory = 0x0;
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(data, 0, sizeof(kData));
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(kBucketId,
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory,
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           kBucketSize, MockCommandBufferEngine::kValidShmId,
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           kDataOffsetInSharedMemory);
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kBucketSize, *memory);
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(data, kData, kBucketSize));
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that we can get a piece.
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *memory = 0x0;
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(data, 0, sizeof(kData));
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 kPieceSize = kBucketSize / 2;
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(kBucketId,
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory,
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           kPieceSize, MockCommandBufferEngine::kValidShmId,
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           kDataOffsetInSharedMemory);
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kBucketSize, *memory);
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(data, kData, kPieceSize));
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(data + kPieceSize, zero, sizeof(kData) - kPieceSize));
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that it fails if the result_id is invalid
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(kInvalidBucketId,
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory,
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           0, 0, 0);
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that it fails if the data_id is invalid
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(kBucketId,
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory,
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           1, MockCommandBufferEngine::kInvalidShmId, 0);
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that it fails if the data_size is invalid
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(kBucketId,
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory,
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           1, 0, 0);
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(kBucketId,
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory,
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           MockCommandBufferEngine::kBufferSize + 1,
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           MockCommandBufferEngine::kValidShmId, 0);
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that it fails if the data_offset is invalid
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(kBucketId,
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory,
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           0, 0, 1);
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(kBucketId,
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory,
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           MockCommandBufferEngine::kBufferSize,
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           MockCommandBufferEngine::kValidShmId, 1);
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that it fails if the result size is not set to zero
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *memory = 0x1;
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(kBucketId,
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory,
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           0, 0, 0);
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CommonDecoderTest, GetBucketData) {
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd::SetBucketSize size_cmd;
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd::SetBucketData set_cmd;
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd::GetBucketData cmd;
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char kData[] = "1234567890123456789";
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char zero[sizeof(kData)] = { 0, };
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 kBucketId = 123;
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 kInvalidBucketId = 124;
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_cmd.Init(kBucketId, sizeof(kData));
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(size_cmd));
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 kSomeOffsetInSharedMemory = 50;
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint8* memory = engine_.GetSharedMemoryAs<uint8*>(kSomeOffsetInSharedMemory);
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(memory, kData, sizeof(kData));
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_cmd.Init(kBucketId, 0, sizeof(kData),
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory);
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(set_cmd));
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can get the whole thing.
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(memory, 0, sizeof(kData));
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(kBucketId, 0, sizeof(kData),
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory);
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(memory, kData, sizeof(kData)));
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can get a piece.
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 kSomeOffsetInBucket = 5;
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 kLengthOfPiece = 6;
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint8 kSentinel = 0xff;
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(memory, 0, sizeof(kData));
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memory[-1] = kSentinel;
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(kBucketId, kSomeOffsetInBucket, kLengthOfPiece,
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory);
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(memory, kData + kSomeOffsetInBucket, kLengthOfPiece));
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(memory + kLengthOfPiece, zero,
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      sizeof(kData) - kLengthOfPiece));
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kSentinel, memory[-1]);
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that it fails if the bucket_id is invalid
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(kInvalidBucketId, kSomeOffsetInBucket, sizeof(kData),
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory);
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that it fails if the offset is invalid
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(kBucketId, sizeof(kData) + 1, 1,
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory);
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that it fails if the size is invalid
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(kBucketId, 0, sizeof(kData) + 1,
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory);
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gpu
514