blob: 2823379a04106d0695b82d9ee407db28424e4f8d [file] [log] [blame]
// Copyright (c) 2009 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "gpu/command_buffer/service/gles2_cmd_decoder.h"
#include "gpu/command_buffer/common/gl_mock.h"
#include "gpu/command_buffer/common/gles2_cmd_format.h"
#include "gpu/command_buffer/common/gles2_cmd_utils.h"
#include "gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h"
#include "gpu/command_buffer/service/cmd_buffer_engine.h"
#include "gpu/command_buffer/service/context_group.h"
#include "gpu/command_buffer/service/program_manager.h"
#include "testing/gtest/include/gtest/gtest.h"
using ::gfx::MockGLInterface;
using ::testing::_;
using ::testing::DoAll;
using ::testing::InSequence;
using ::testing::MatcherCast;
using ::testing::Pointee;
using ::testing::Return;
using ::testing::SetArrayArgument;
using ::testing::SetArgumentPointee;
using ::testing::StrEq;
namespace gpu {
namespace gles2 {
class GLES2DecoderTest2 : public GLES2DecoderTestBase {
public:
GLES2DecoderTest2() { }
};
template <>
void GLES2DecoderTestBase::SpecializedSetup<LinkProgram, 0>(bool /* valid */) {
const GLuint kClientVertexShaderId = 5001;
const GLuint kServiceVertexShaderId = 6001;
const GLuint kClientFragmentShaderId = 5002;
const GLuint kServiceFragmentShaderId = 6002;
DoCreateShader(
GL_VERTEX_SHADER, kClientVertexShaderId, kServiceVertexShaderId);
DoCreateShader(
GL_FRAGMENT_SHADER, kClientFragmentShaderId, kServiceFragmentShaderId);
GetShaderInfo(kClientVertexShaderId)->SetStatus(true, "", NULL);
GetShaderInfo(kClientFragmentShaderId)->SetStatus(true, "", NULL);
InSequence dummy;
EXPECT_CALL(*gl_,
AttachShader(kServiceProgramId, kServiceVertexShaderId))
.Times(1)
.RetiresOnSaturation();
EXPECT_CALL(*gl_,
AttachShader(kServiceProgramId, kServiceFragmentShaderId))
.Times(1)
.RetiresOnSaturation();
EXPECT_CALL(*gl_, GetProgramiv(kServiceProgramId, GL_LINK_STATUS, _))
.WillOnce(SetArgumentPointee<2>(1));
EXPECT_CALL(*gl_,
GetProgramiv(kServiceProgramId, GL_INFO_LOG_LENGTH, _))
.WillOnce(SetArgumentPointee<2>(0))
.RetiresOnSaturation();
EXPECT_CALL(*gl_, GetProgramiv(kServiceProgramId, GL_ACTIVE_ATTRIBUTES, _))
.WillOnce(SetArgumentPointee<2>(0));
EXPECT_CALL(
*gl_,
GetProgramiv(kServiceProgramId, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, _))
.WillOnce(SetArgumentPointee<2>(0));
EXPECT_CALL(*gl_, GetProgramiv(kServiceProgramId, GL_ACTIVE_UNIFORMS, _))
.WillOnce(SetArgumentPointee<2>(0));
EXPECT_CALL(
*gl_,
GetProgramiv(kServiceProgramId, GL_ACTIVE_UNIFORM_MAX_LENGTH, _))
.WillOnce(SetArgumentPointee<2>(0));
AttachShader attach_cmd;
attach_cmd.Init(client_program_id_, kClientVertexShaderId);
EXPECT_EQ(error::kNoError, ExecuteCmd(attach_cmd));
attach_cmd.Init(client_program_id_, kClientFragmentShaderId);
EXPECT_EQ(error::kNoError, ExecuteCmd(attach_cmd));
};
template <>
void GLES2DecoderTestBase::SpecializedSetup<ValidateProgram, 0>(
bool /* valid */) {
// Needs the same setup as LinkProgram.
SpecializedSetup<LinkProgram, 0>(false);
EXPECT_CALL(*gl_, LinkProgram(kServiceProgramId))
.Times(1)
.RetiresOnSaturation();
LinkProgram link_cmd;
link_cmd.Init(client_program_id_);
EXPECT_EQ(error::kNoError, ExecuteCmd(link_cmd));
EXPECT_CALL(*gl_,
GetProgramiv(kServiceProgramId, GL_INFO_LOG_LENGTH, _))
.WillOnce(SetArgumentPointee<2>(0))
.RetiresOnSaturation();
};
template <>
void GLES2DecoderTestBase::SpecializedSetup<Uniform1f, 0>(bool /* valid */) {
SetupShaderForUniform();
};
template <>
void GLES2DecoderTestBase::SpecializedSetup<Uniform1fv, 0>(bool /* valid */) {
SetupShaderForUniform();
};
template <>
void GLES2DecoderTestBase::SpecializedSetup<Uniform1fvImmediate, 0>(
bool /* valid */) {
SetupShaderForUniform();
};
template <>
void GLES2DecoderTestBase::SpecializedSetup<Uniform2f, 0>(bool /* valid */) {
SetupShaderForUniform();
};
template <>
void GLES2DecoderTestBase::SpecializedSetup<Uniform2fv, 0>(bool /* valid */) {
SetupShaderForUniform();
};
template <>
void GLES2DecoderTestBase::SpecializedSetup<Uniform2fvImmediate, 0>(
bool /* valid */) {
SetupShaderForUniform();
};
template <>
void GLES2DecoderTestBase::SpecializedSetup<Uniform3f, 0>(bool /* valid */) {
SetupShaderForUniform();
};
template <>
void GLES2DecoderTestBase::SpecializedSetup<Uniform3fv, 0>(bool /* valid */) {
SetupShaderForUniform();
};
template <>
void GLES2DecoderTestBase::SpecializedSetup<Uniform3fvImmediate, 0>(
bool /* valid */) {
SetupShaderForUniform();
};
template <>
void GLES2DecoderTestBase::SpecializedSetup<Uniform4f, 0>(bool /* valid */) {
SetupShaderForUniform();
};
template <>
void GLES2DecoderTestBase::SpecializedSetup<Uniform4fv, 0>(bool /* valid */) {
SetupShaderForUniform();
};
template <>
void GLES2DecoderTestBase::SpecializedSetup<Uniform4fvImmediate, 0>(
bool /* valid */) {
SetupShaderForUniform();
};
template <>
void GLES2DecoderTestBase::SpecializedSetup<RenderbufferStorage, 0>(
bool valid) {
DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_,
kServiceRenderbufferId);
if (valid) {
EXPECT_CALL(*gl_, GetError())
.WillOnce(Return(GL_NO_ERROR))
.RetiresOnSaturation();
EXPECT_CALL(*gl_,
RenderbufferStorageEXT(GL_RENDERBUFFER, _, 3, 4))
.Times(1)
.RetiresOnSaturation();
EXPECT_CALL(*gl_, GetError())
.WillOnce(Return(GL_NO_ERROR))
.RetiresOnSaturation();
}
};
template <>
void GLES2DecoderTestBase::SpecializedSetup<TexParameterf, 0>(
bool /* valid */) {
DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
};
template <>
void GLES2DecoderTestBase::SpecializedSetup<TexParameteri, 0>(
bool /* valid */) {
DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
};
template <>
void GLES2DecoderTestBase::SpecializedSetup<TexParameterfv, 0>(
bool /* valid */) {
DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
};
template <>
void GLES2DecoderTestBase::SpecializedSetup<TexParameterfvImmediate, 0>(
bool /* valid */) {
DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
};
template <>
void GLES2DecoderTestBase::SpecializedSetup<TexParameteriv, 0>(
bool /* valid */) {
DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
};
template <>
void GLES2DecoderTestBase::SpecializedSetup<TexParameterivImmediate, 0>(
bool /* valid */) {
DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
};
template <>
void GLES2DecoderTestBase::SpecializedSetup<GetVertexAttribiv, 0>(bool valid) {
DoBindBuffer(GL_ARRAY_BUFFER, client_buffer_id_, kServiceBufferId);
DoVertexAttribPointer(1, 1, GL_FLOAT, 0, 0);
if (valid) {
EXPECT_CALL(*gl_, GetError())
.WillOnce(Return(GL_NO_ERROR))
.WillOnce(Return(GL_NO_ERROR))
.RetiresOnSaturation();
}
};
#include "gpu/command_buffer/service/gles2_cmd_decoder_unittest_2_autogen.h"
} // namespace gles2
} // namespace gpu