gles2_cmd_decoder_unittest_base.h revision 5821806d5e7f356e8fa4b058a389a808ea183019
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)#ifndef GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_UNITTEST_BASE_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_UNITTEST_BASE_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/common/gl_mock.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/common/gles2_cmd_format.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/common/gles2_cmd_utils.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/buffer_manager.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/cmd_buffer_engine.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/context_group.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/framebuffer_manager.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/gles2_cmd_decoder.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/program_manager.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/query_manager.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/renderbuffer_manager.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/shader_manager.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/test_helper.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/texture_manager.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/vertex_array_manager.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_context_stub.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_surface_stub.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GLES2DecoderTestBase : public testing::Test {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLES2DecoderTestBase();
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~GLES2DecoderTestBase();
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Template to call glGenXXX functions.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template <typename T>
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GenHelper(GLuint client_id) {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int8 buffer[sizeof(T) + sizeof(client_id)];
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    T& cmd = *reinterpret_cast<T*>(&buffer);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd.Init(1, &client_id);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(error::kNoError,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              ExecuteImmediateCmd(cmd, sizeof(client_id)));
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This template exists solely so we can specialize it for
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // certain commands.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template <typename T, int id>
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SpecializedSetup(bool valid) {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template <typename T>
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  T* GetImmediateAs() {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return reinterpret_cast<T*>(immediate_buffer_);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template <typename T, typename Command>
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  T GetImmediateDataAs(Command* cmd) {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return reinterpret_cast<T>(ImmediateDataAddress(cmd));
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ClearSharedMemory() {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    engine_->ClearSharedMemory();
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template <typename T>
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error::Error ExecuteCmd(const T& cmd) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    COMPILE_ASSERT(T::kArgFlags == cmd::kFixed, Cmd_kArgFlags_not_kFixed);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return decoder_->DoCommand(cmd.kCmdId,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               ComputeNumEntries(sizeof(cmd)) - 1,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               &cmd);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template <typename T>
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error::Error ExecuteImmediateCmd(const T& cmd, size_t data_size) {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    COMPILE_ASSERT(T::kArgFlags == cmd::kAtLeastN, Cmd_kArgFlags_not_kAtLeastN);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return decoder_->DoCommand(cmd.kCmdId,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               ComputeNumEntries(sizeof(cmd) + data_size) - 1,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               &cmd);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template <typename T>
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  T GetSharedMemoryAs() {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return reinterpret_cast<T>(shared_memory_address_);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template <typename T>
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  T GetSharedMemoryAsWithOffset(uint32 offset) {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void* ptr = reinterpret_cast<int8*>(shared_memory_address_) + offset;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return reinterpret_cast<T>(ptr);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IdAllocatorInterface* GetIdAllocator(GLuint namespace_id) {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return group_->GetIdAllocator(namespace_id);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BufferManager::BufferInfo* GetBufferInfo(GLuint service_id) {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return group_->buffer_manager()->GetBufferInfo(service_id);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FramebufferManager::FramebufferInfo* GetFramebufferInfo(GLuint service_id) {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return group_->framebuffer_manager()->GetFramebufferInfo(service_id);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderbufferManager::RenderbufferInfo* GetRenderbufferInfo(
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLuint service_id) {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return group_->renderbuffer_manager()->GetRenderbufferInfo(service_id);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TextureManager::TextureInfo* GetTextureInfo(GLuint client_id) {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return group_->texture_manager()->GetTextureInfo(client_id);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShaderManager::ShaderInfo* GetShaderInfo(GLuint client_id) {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return group_->shader_manager()->GetShaderInfo(client_id);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProgramManager::ProgramInfo* GetProgramInfo(GLuint client_id) {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return group_->program_manager()->GetProgramInfo(client_id);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QueryManager::Query* GetQueryInfo(GLuint client_id) {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return decoder_->GetQueryManager()->GetQuery(client_id);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This name doesn't match the underlying function, but doing it this way
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // prevents the need to special-case the unit test generation
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VertexAttribManager* GetVertexArrayInfo(GLuint client_id) {
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return decoder_->GetVertexArrayManager()->GetVertexAttribManager(client_id);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProgramManager* program_manager() {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return group_->program_manager();
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoCreateProgram(GLuint client_id, GLuint service_id);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoCreateShader(GLenum shader_type, GLuint client_id, GLuint service_id);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetBucketAsCString(uint32 bucket_id, const char* str);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void InitDecoder(
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const char* extensions,
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool has_alpha,
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool has_depth,
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool has_stencil,
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool request_alpha,
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool request_depth,
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool request_stencil,
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool bind_generates_resource);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ContextGroup& group() const {
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return *group_.get();
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ::testing::StrictMock< ::gfx::MockGLInterface>* GetGLMock() const {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return gl_.get();
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLES2Decoder* GetDecoder() const {
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return decoder_.get();
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef TestHelper::AttribInfo AttribInfo;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef TestHelper::UniformInfo UniformInfo;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetupShader(
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AttribInfo* attribs, size_t num_attribs,
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UniformInfo* uniforms, size_t num_uniforms,
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLuint client_id, GLuint service_id,
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLuint vertex_shader_client_id, GLuint vertex_shader_service_id,
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLuint fragment_shader_client_id, GLuint fragment_shader_service_id);
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetupExpectationsForClearingUniforms(
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UniformInfo* uniforms, size_t num_uniforms) {
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestHelper::SetupExpectationsForClearingUniforms(
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        gl_.get(), uniforms, num_uniforms);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetupInitCapabilitiesExpectations();
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetupInitStateExpectations();
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ExpectEnableDisable(GLenum cap, bool enable);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Setups up a shader for testing glUniform.
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetupShaderForUniform();
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetupDefaultProgram();
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetupCubemapProgram();
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetupTexture();
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note that the error is returned as GLint instead of GLenum.
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is because there is a mismatch in the types of GLenum and
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the error values GL_NO_ERROR, GL_INVALID_ENUM, etc. GLenum is
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // typedef'd as unsigned int while the error values are defined as
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // integers. This is problematic for template functions such as
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // EXPECT_EQ that expect both types to be the same.
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint GetGLError();
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoBindBuffer(GLenum target, GLuint client_id, GLuint service_id);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoBindFramebuffer(GLenum target, GLuint client_id, GLuint service_id);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoBindRenderbuffer(GLenum target, GLuint client_id, GLuint service_id);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoBindTexture(GLenum target, GLuint client_id, GLuint service_id);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoBindVertexArrayOES(GLuint client_id, GLuint service_id);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool DoIsBuffer(GLuint client_id);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool DoIsFramebuffer(GLuint client_id);
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool DoIsProgram(GLuint client_id);
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool DoIsRenderbuffer(GLuint client_id);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool DoIsShader(GLuint client_id);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool DoIsTexture(GLuint client_id);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoDeleteBuffer(GLuint client_id, GLuint service_id);
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoDeleteFramebuffer(
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLuint client_id, GLuint service_id,
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool reset_draw, GLenum draw_target, GLuint draw_id,
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool reset_read, GLenum read_target, GLuint read_id);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoDeleteProgram(GLuint client_id, GLuint service_id);
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoDeleteRenderbuffer(GLuint client_id, GLuint service_id);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoDeleteShader(GLuint client_id, GLuint service_id);
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoDeleteTexture(GLuint client_id, GLuint service_id);
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoCompressedTexImage2D(
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum target, GLint level, GLenum format,
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLsizei width, GLsizei height, GLint border,
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLsizei size, uint32 bucket_id);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoTexImage2D(
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum target, GLint level, GLenum internal_format,
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLsizei width, GLsizei height, GLint border,
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum format, GLenum type,
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uint32 shared_memory_id, uint32 shared_memory_offset);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoTexImage2DSameSize(
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum target, GLint level, GLenum internal_format,
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLsizei width, GLsizei height, GLint border,
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum format, GLenum type,
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uint32 shared_memory_id, uint32 shared_memory_offset);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoRenderbufferStorage(
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum target, GLenum internal_format, GLenum actual_format,
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLsizei width, GLsizei height, GLenum error);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoFramebufferRenderbuffer(
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum target,
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum attachment,
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum renderbuffer_target,
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLuint renderbuffer_client_id,
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLuint renderbuffer_service_id,
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum error);
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoFramebufferTexture2D(
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum target, GLenum attachment, GLenum tex_target,
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLuint texture_client_id, GLuint texture_service_id,
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLint level, GLenum error);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoVertexAttribPointer(
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLuint index, GLint size, GLenum type, GLsizei stride, GLuint offset);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoVertexAttribDivisorANGLE(GLuint index, GLuint divisor);
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoEnableVertexAttribArray(GLint index);
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoBufferData(GLenum target, GLsizei size);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoBufferSubData(
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum target, GLint offset, GLsizei size, const void* data);
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetupVertexBuffer();
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetupAllNeededVertexBuffers();
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetupIndexBuffer();
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DeleteVertexBuffer();
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DeleteIndexBuffer();
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetupClearTextureExpections(
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLuint service_id,
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLuint old_service_id,
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum bind_target,
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum target,
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLint level,
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum format,
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum type,
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLsizei width,
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLsizei height);
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetupExpectationsForRestoreClearState(
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLclampf restore_red,
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLclampf restore_green,
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLclampf restore_blue,
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLclampf restore_alpha,
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLuint restore_stencil,
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLclampf restore_depth,
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool restore_scissor_test);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetupExpectationsForFramebufferClearing(
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum target,
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLuint clear_bits,
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLclampf restore_red,
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLclampf restore_green,
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLclampf restore_blue,
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLclampf restore_alpha,
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLuint restore_stencil,
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLclampf restore_depth,
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool restore_scissor_test);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetupExpectationsForFramebufferClearingMulti(
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLuint read_framebuffer_service_id,
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLuint draw_framebuffer_service_id,
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum target,
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLuint clear_bits,
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLclampf restore_red,
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLclampf restore_green,
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLclampf restore_blue,
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLclampf restore_alpha,
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLuint restore_stencil,
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLclampf restore_depth,
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool restore_scissor_test);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetupExpectationsForApplyingDirtyState(
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool framebuffer_is_rgb,
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool framebuffer_has_depth,
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool framebuffer_has_stencil,
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLuint color_bits,  // NOTE! bits are 0x1000, 0x0100, 0x0010, and 0x0001
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool depth_mask,
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool depth_enabled,
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLuint front_stencil_mask,
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLuint back_stencil_mask,
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool stencil_enabled,
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool cull_face_enabled,
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool scissor_test_enabled,
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool blend_enabled);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetupExpectationsForApplyingDefaultDirtyState();
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddExpectationsForSimulatedAttrib0WithError(
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLsizei num_vertices, GLuint buffer_id, GLenum error);
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddExpectationsForSimulatedAttrib0(
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLsizei num_vertices, GLuint buffer_id);
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddExpectationsForGenVertexArraysOES();
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddExpectationsForDeleteVertexArraysOES();
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddExpectationsForBindVertexArrayOES();
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddExpectationsForRestoreAttribState(GLuint attrib);
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLvoid* BufferOffset(unsigned i) {
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return static_cast<int8 *>(NULL)+(i);
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template <typename Command, typename Result>
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsObjectHelper(GLuint client_id) {
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Result* result = static_cast<Result*>(shared_memory_address_);
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Command cmd;
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd.Init(client_id, kSharedMemoryId, kSharedMemoryOffset);
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool isObject = static_cast<bool>(*result);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(GL_NO_ERROR, GetGLError());
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return isObject;
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kBackBufferWidth = 128;
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kBackBufferHeight = 64;
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kMaxTextureSize = 2048;
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kMaxCubeMapTextureSize = 256;
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kNumVertexAttribs = 16;
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kNumTextureUnits = 8;
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kMaxTextureImageUnits = 8;
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kMaxVertexTextureImageUnits = 2;
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kMaxFragmentUniformVectors = 16;
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kMaxVaryingVectors = 8;
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kMaxVertexUniformVectors = 128;
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kMaxViewportWidth = 8192;
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kMaxViewportHeight = 8192;
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kViewportX = 0;
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kViewportY = 0;
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kViewportWidth = kBackBufferWidth;
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kViewportHeight = kBackBufferHeight;
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kServiceAttrib0BufferId = 801;
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kServiceFixedAttribBufferId = 802;
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kServiceBufferId = 301;
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kServiceFramebufferId = 302;
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kServiceRenderbufferId = 303;
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kServiceTextureId = 304;
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kServiceProgramId = 305;
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kServiceShaderId = 306;
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kServiceElementBufferId = 308;
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kServiceQueryId = 309;
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kServiceVertexArrayId = 310;
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int32 kSharedMemoryId = 401;
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const size_t kSharedBufferSize = 2048;
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const uint32 kSharedMemoryOffset = 132;
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int32 kInvalidSharedMemoryId = 402;
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const uint32 kInvalidSharedMemoryOffset = kSharedBufferSize + 1;
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const uint32 kInitialResult = 0xBDBDBDBDu;
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const uint8 kInitialMemoryValue = 0xBDu;
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const uint32 kNewClientId = 501;
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const uint32 kNewServiceId = 502;
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const uint32 kInvalidClientId = 601;
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kServiceVertexShaderId = 321;
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kServiceFragmentShaderId = 322;
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kServiceCopyTextureChromiumShaderId = 701;
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kServiceCopyTextureChromiumProgramId = 721;
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kServiceCopyTextureChromiumTextureBufferId = 751;
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kServiceCopyTextureChromiumVertexBufferId = 752;
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kServiceCopyTextureChromiumFBOId = 753;
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kServiceCopyTextureChromiumPositionAttrib = 761;
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kServiceCopyTextureChromiumTexAttrib = 762;
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kServiceCopyTextureChromiumSamplerLocation = 763;
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLsizei kNumVertices = 100;
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLsizei kNumIndices = 10;
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kValidIndexRangeStart = 1;
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kValidIndexRangeCount = 7;
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kInvalidIndexRangeStart = 0;
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kInvalidIndexRangeCount = 7;
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kOutOfRangeIndexRangeEnd = 10;
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kMaxValidIndex = 7;
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kMaxAttribLength = 10;
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* kAttrib1Name;
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* kAttrib2Name;
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* kAttrib3Name;
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kAttrib1Size = 1;
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kAttrib2Size = 1;
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kAttrib3Size = 1;
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kAttrib1Location = 0;
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kAttrib2Location = 1;
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kAttrib3Location = 2;
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLenum kAttrib1Type = GL_FLOAT_VEC4;
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLenum kAttrib2Type = GL_FLOAT_VEC2;
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLenum kAttrib3Type = GL_FLOAT_VEC3;
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kInvalidAttribLocation = 30;
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kBadAttribIndex = kNumVertexAttribs;
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kMaxUniformLength = 12;
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* kUniform1Name;
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* kUniform2Name;
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* kUniform3Name;
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kUniform1Size = 1;
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kUniform2Size = 3;
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kUniform3Size = 2;
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kUniform1RealLocation = 3;
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kUniform2RealLocation = 10;
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kUniform2ElementRealLocation = 12;
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kUniform3RealLocation = 20;
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kUniform1FakeLocation = 0;               // These are
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kUniform2FakeLocation = 1;               // hardcoded
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kUniform2ElementFakeLocation = 0x10001;  // to match
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kUniform3FakeLocation = 2;               // ProgramManager.
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kUniform1DesiredLocation = -1;
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kUniform2DesiredLocation = -1;
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kUniform3DesiredLocation = -1;
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLenum kUniform1Type = GL_SAMPLER_2D;
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLenum kUniform2Type = GL_INT_VEC2;
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLenum kUniform3Type = GL_FLOAT_VEC3;
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLenum kUniformCubemapType = GL_SAMPLER_CUBE;
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kInvalidUniformLocation = 30;
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kBadUniformIndex = 1000;
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use StrictMock to make 100% sure we know how GL will be called.
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_;
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<gfx::GLSurfaceStub> surface_;
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<gfx::GLContextStub> context_;
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<GLES2Decoder> decoder_;
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint client_buffer_id_;
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint client_framebuffer_id_;
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint client_program_id_;
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint client_renderbuffer_id_;
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint client_shader_id_;
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint client_texture_id_;
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint client_element_buffer_id_;
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint client_vertex_shader_id_;
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint client_fragment_shader_id_;
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint client_query_id_;
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint client_vertexarray_id_;
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 shared_memory_id_;
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 shared_memory_offset_;
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* shared_memory_address_;
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* shared_memory_base_;
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int8 immediate_buffer_[256];
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class MockCommandBufferEngine : public CommandBufferEngine {
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockCommandBufferEngine();
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~MockCommandBufferEngine();
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual Buffer GetSharedMemoryBuffer(int32 shm_id) OVERRIDE;
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void ClearSharedMemory() {
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      memset(data_.get(), kInitialMemoryValue, kSharedBufferSize);
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void set_token(int32 token) OVERRIDE;
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool SetGetBuffer(int32 /* transfer_buffer_id */) OVERRIDE;
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Overridden from CommandBufferEngine.
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool SetGetOffset(int32 offset) OVERRIDE;
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Overridden from CommandBufferEngine.
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual int32 GetGetOffset() OVERRIDE;
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_array<int8> data_;
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Buffer valid_buffer_;
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Buffer invalid_buffer_;
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddExpectationsForVertexAttribManager();
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr< ::testing::StrictMock<MockCommandBufferEngine> > engine_;
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContextGroup::Ref group_;
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GLES2DecoderWithShaderTestBase : public GLES2DecoderTestBase {
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLES2DecoderWithShaderTestBase()
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : GLES2DecoderTestBase() {
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE;
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE;
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gles2
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gpu
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_UNITTEST_BASE_H_
541