Home | History | Annotate | Download | only in service
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h"
      6 
      7 #include "gpu/command_buffer/common/gles2_cmd_format.h"
      8 #include "gpu/command_buffer/common/gles2_cmd_utils.h"
      9 #include "gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h"
     10 #include "gpu/command_buffer/service/cmd_buffer_engine.h"
     11 #include "gpu/command_buffer/service/context_group.h"
     12 #include "gpu/command_buffer/service/program_manager.h"
     13 #include "testing/gtest/include/gtest/gtest.h"
     14 #include "ui/gl/gl_mock.h"
     15 
     16 using ::gfx::MockGLInterface;
     17 using ::testing::_;
     18 using ::testing::DoAll;
     19 using ::testing::InSequence;
     20 using ::testing::MatcherCast;
     21 using ::testing::Pointee;
     22 using ::testing::Return;
     23 using ::testing::SetArrayArgument;
     24 using ::testing::SetArgumentPointee;
     25 using ::testing::StrEq;
     26 
     27 namespace gpu {
     28 namespace gles2 {
     29 
     30 namespace {
     31 void ShaderCacheCb(const std::string& key, const std::string& shader) {
     32 }
     33 }  // namespace
     34 
     35 class GLES2DecoderTest1 : public GLES2DecoderTestBase {
     36  public:
     37   GLES2DecoderTest1() { }
     38 };
     39 
     40 INSTANTIATE_TEST_CASE_P(Service, GLES2DecoderTest1, ::testing::Bool());
     41 
     42 template <>
     43 void GLES2DecoderTestBase::SpecializedSetup<cmds::GenerateMipmap, 0>(
     44     bool valid) {
     45   DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
     46   DoTexImage2D(
     47       GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE,
     48       kSharedMemoryId, kSharedMemoryOffset);
     49   if (valid) {
     50     EXPECT_CALL(*gl_, GetError())
     51         .WillOnce(Return(GL_NO_ERROR))
     52         .WillOnce(Return(GL_NO_ERROR))
     53         .RetiresOnSaturation();
     54   }
     55 };
     56 
     57 template <>
     58 void GLES2DecoderTestBase::SpecializedSetup<cmds::CheckFramebufferStatus, 0>(
     59     bool /* valid */) {
     60   // Give it a valid framebuffer.
     61   DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_,
     62                     kServiceRenderbufferId);
     63   DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_,
     64                     kServiceFramebufferId);
     65   DoRenderbufferStorage(
     66       GL_RENDERBUFFER, GL_RGBA4, GL_RGBA, 1, 1, GL_NO_ERROR);
     67   DoFramebufferRenderbuffer(
     68       GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
     69       client_renderbuffer_id_, kServiceRenderbufferId, GL_NO_ERROR);
     70 };
     71 
     72 template <>
     73 void GLES2DecoderTestBase::SpecializedSetup<cmds::Clear, 0>(bool valid) {
     74   if (valid) {
     75     SetupExpectationsForApplyingDefaultDirtyState();
     76   }
     77 };
     78 
     79 template <>
     80 void GLES2DecoderTestBase::SpecializedSetup<cmds::ColorMask, 0>(
     81     bool /* valid */) {
     82   // We bind a framebuffer color the colormask test since the framebuffer
     83   // will be considered RGB.
     84   DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_,
     85                     kServiceFramebufferId);
     86 };
     87 
     88 template <>
     89 void GLES2DecoderTestBase::SpecializedSetup<cmds::CopyTexImage2D, 0>(
     90     bool valid) {
     91   if (valid) {
     92     EXPECT_CALL(*gl_, GetError())
     93         .WillOnce(Return(GL_NO_ERROR))
     94         .WillOnce(Return(GL_NO_ERROR))
     95         .RetiresOnSaturation();
     96   }
     97 };
     98 
     99 template <>
    100 void GLES2DecoderTestBase::SpecializedSetup<cmds::CopyTexSubImage2D, 0>(
    101     bool valid) {
    102   if (valid) {
    103     DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
    104     DoTexImage2D(
    105         GL_TEXTURE_2D, 2, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE,
    106         kSharedMemoryId, kSharedMemoryOffset);
    107   }
    108 };
    109 
    110 template <>
    111 void GLES2DecoderTestBase::SpecializedSetup<cmds::DetachShader, 0>(bool valid) {
    112   if (valid) {
    113     EXPECT_CALL(*gl_,
    114                 AttachShader(kServiceProgramId, kServiceShaderId))
    115         .Times(1)
    116         .RetiresOnSaturation();
    117     cmds::AttachShader attach_cmd;
    118     attach_cmd.Init(client_program_id_, client_shader_id_);
    119     EXPECT_EQ(error::kNoError, ExecuteCmd(attach_cmd));
    120   }
    121 };
    122 
    123 template <>
    124 void GLES2DecoderTestBase::SpecializedSetup<cmds::FramebufferRenderbuffer, 0>(
    125     bool valid) {
    126   DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_,
    127                     kServiceFramebufferId);
    128   if (valid) {
    129     EXPECT_CALL(*gl_, GetError())
    130         .WillOnce(Return(GL_NO_ERROR))
    131         .WillOnce(Return(GL_NO_ERROR))
    132         .RetiresOnSaturation();
    133   }
    134 };
    135 
    136 template <>
    137 void GLES2DecoderTestBase::SpecializedSetup<cmds::FramebufferTexture2D, 0>(
    138     bool valid) {
    139   DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_,
    140                     kServiceFramebufferId);
    141   if (valid) {
    142     EXPECT_CALL(*gl_, GetError())
    143         .WillOnce(Return(GL_NO_ERROR))
    144         .WillOnce(Return(GL_NO_ERROR))
    145         .RetiresOnSaturation();
    146   }
    147 };
    148 
    149 template <>
    150 void GLES2DecoderTestBase::SpecializedSetup<
    151     cmds::GetBufferParameteriv, 0>(bool /* valid */) {
    152   DoBindBuffer(GL_ARRAY_BUFFER, client_buffer_id_, kServiceBufferId);
    153 };
    154 
    155 template <>
    156 void GLES2DecoderTestBase::SpecializedSetup<
    157     cmds::GetFramebufferAttachmentParameteriv, 0>(bool /* valid */) {
    158   DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_,
    159                     kServiceFramebufferId);
    160 };
    161 
    162 template <>
    163 void GLES2DecoderTestBase::SpecializedSetup<
    164     cmds::GetRenderbufferParameteriv, 0>(
    165         bool /* valid */) {
    166   DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_,
    167                     kServiceRenderbufferId);
    168 };
    169 
    170 template <>
    171 void GLES2DecoderTestBase::SpecializedSetup<cmds::GetProgramiv, 0>(
    172     bool valid) {
    173   if (valid) {
    174     // GetProgramiv calls ClearGLError then GetError to make sure
    175     // it actually got a value so it can report correctly to the client.
    176     EXPECT_CALL(*gl_, GetError())
    177         .WillOnce(Return(GL_NO_ERROR))
    178         .RetiresOnSaturation();
    179     EXPECT_CALL(*gl_, GetError())
    180         .WillOnce(Return(GL_NO_ERROR))
    181         .RetiresOnSaturation();
    182   }
    183 }
    184 
    185 template <>
    186 void GLES2DecoderTestBase::SpecializedSetup<cmds::GetProgramInfoLog, 0>(
    187     bool /* valid */) {
    188   const GLuint kClientVertexShaderId = 5001;
    189   const GLuint kServiceVertexShaderId = 6001;
    190   const GLuint kClientFragmentShaderId = 5002;
    191   const GLuint kServiceFragmentShaderId = 6002;
    192   const char* log = "hello";  // Matches auto-generated unit test.
    193   DoCreateShader(
    194       GL_VERTEX_SHADER, kClientVertexShaderId, kServiceVertexShaderId);
    195   DoCreateShader(
    196       GL_FRAGMENT_SHADER, kClientFragmentShaderId, kServiceFragmentShaderId);
    197 
    198   GetShader(kClientVertexShaderId)->SetStatus(true, "", NULL);
    199   GetShader(kClientFragmentShaderId)->SetStatus(true, "", NULL);
    200 
    201   InSequence dummy;
    202   EXPECT_CALL(*gl_,
    203               AttachShader(kServiceProgramId, kServiceVertexShaderId))
    204       .Times(1)
    205       .RetiresOnSaturation();
    206   EXPECT_CALL(*gl_,
    207               AttachShader(kServiceProgramId, kServiceFragmentShaderId))
    208       .Times(1)
    209       .RetiresOnSaturation();
    210   EXPECT_CALL(*gl_, LinkProgram(kServiceProgramId))
    211       .Times(1)
    212       .RetiresOnSaturation();
    213   EXPECT_CALL(*gl_, GetProgramiv(kServiceProgramId, GL_LINK_STATUS, _))
    214       .WillOnce(SetArgumentPointee<2>(1));
    215   EXPECT_CALL(*gl_,
    216       GetProgramiv(kServiceProgramId, GL_INFO_LOG_LENGTH, _))
    217       .WillOnce(SetArgumentPointee<2>(strlen(log) + 1))
    218       .RetiresOnSaturation();
    219   EXPECT_CALL(*gl_,
    220       GetProgramInfoLog(kServiceProgramId, strlen(log) + 1, _, _))
    221       .WillOnce(DoAll(
    222           SetArgumentPointee<2>(strlen(log)),
    223           SetArrayArgument<3>(log, log + strlen(log) + 1)))
    224       .RetiresOnSaturation();
    225   EXPECT_CALL(*gl_, GetProgramiv(kServiceProgramId, GL_ACTIVE_ATTRIBUTES, _))
    226       .WillOnce(SetArgumentPointee<2>(0));
    227   EXPECT_CALL(
    228       *gl_,
    229       GetProgramiv(kServiceProgramId, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, _))
    230       .WillOnce(SetArgumentPointee<2>(0));
    231   EXPECT_CALL(*gl_, GetProgramiv(kServiceProgramId, GL_ACTIVE_UNIFORMS, _))
    232       .WillOnce(SetArgumentPointee<2>(0));
    233   EXPECT_CALL(
    234       *gl_,
    235       GetProgramiv(kServiceProgramId, GL_ACTIVE_UNIFORM_MAX_LENGTH, _))
    236       .WillOnce(SetArgumentPointee<2>(0));
    237 
    238   Program* program = GetProgram(client_program_id_);
    239   ASSERT_TRUE(program != NULL);
    240 
    241   cmds::AttachShader attach_cmd;
    242   attach_cmd.Init(client_program_id_, kClientVertexShaderId);
    243   EXPECT_EQ(error::kNoError, ExecuteCmd(attach_cmd));
    244 
    245   attach_cmd.Init(client_program_id_, kClientFragmentShaderId);
    246   EXPECT_EQ(error::kNoError, ExecuteCmd(attach_cmd));
    247 
    248   program->Link(NULL, NULL, NULL, Program::kCountOnlyStaticallyUsed,
    249                 base::Bind(&ShaderCacheCb));
    250 };
    251 
    252 template <>
    253 void GLES2DecoderTestBase::SpecializedSetup<cmds::GetVertexAttribfv, 0>(
    254     bool valid) {
    255   DoBindBuffer(GL_ARRAY_BUFFER, client_buffer_id_, kServiceBufferId);
    256   DoVertexAttribPointer(1, 1, GL_FLOAT, 0, 0);
    257   if (valid) {
    258     EXPECT_CALL(*gl_, GetError())
    259         .WillOnce(Return(GL_NO_ERROR))
    260         .WillOnce(Return(GL_NO_ERROR))
    261         .RetiresOnSaturation();
    262   }
    263 };
    264 
    265 template <>
    266 void GLES2DecoderTestBase::SpecializedSetup<cmds::GetVertexAttribiv, 0>(
    267     bool valid) {
    268   DoBindBuffer(GL_ARRAY_BUFFER, client_buffer_id_, kServiceBufferId);
    269   DoVertexAttribPointer(1, 1, GL_FLOAT, 0, 0);
    270   if (valid) {
    271     EXPECT_CALL(*gl_, GetError())
    272         .WillOnce(Return(GL_NO_ERROR))
    273         .WillOnce(Return(GL_NO_ERROR))
    274         .RetiresOnSaturation();
    275   }
    276 };
    277 
    278 template <>
    279 void GLES2DecoderTestBase::SpecializedSetup<cmds::RenderbufferStorage, 0>(
    280     bool valid) {
    281   DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_,
    282                     kServiceRenderbufferId);
    283   if (valid) {
    284     EXPECT_CALL(*gl_, GetError())
    285         .WillOnce(Return(GL_NO_ERROR))
    286         .RetiresOnSaturation();
    287     EXPECT_CALL(*gl_,
    288                 RenderbufferStorageEXT(GL_RENDERBUFFER, _, 3, 4))
    289         .Times(1)
    290         .RetiresOnSaturation();
    291     EXPECT_CALL(*gl_, GetError())
    292         .WillOnce(Return(GL_NO_ERROR))
    293         .RetiresOnSaturation();
    294   }
    295 }
    296 
    297 
    298 #include "gpu/command_buffer/service/gles2_cmd_decoder_unittest_1_autogen.h"
    299 
    300 }  // namespace gles2
    301 }  // namespace gpu
    302 
    303