summaryrefslogtreecommitdiffstats
path: root/gpu/command_buffer/service
diff options
context:
space:
mode:
Diffstat (limited to 'gpu/command_buffer/service')
-rw-r--r--gpu/command_buffer/service/feature_info.cc78
-rw-r--r--gpu/command_buffer/service/feature_info.h9
-rw-r--r--gpu/command_buffer/service/feature_info_unittest.cc3
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder.cc18
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder_autogen.h80
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder_unittest_1_autogen.h12
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder_unittest_2_autogen.h25
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder_unittest_3_autogen.h3
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder_unittest_framebuffers.cc2
9 files changed, 173 insertions, 57 deletions
diff --git a/gpu/command_buffer/service/feature_info.cc b/gpu/command_buffer/service/feature_info.cc
index 9fec2e1..a15c791 100644
--- a/gpu/command_buffer/service/feature_info.cc
+++ b/gpu/command_buffer/service/feature_info.cc
@@ -139,7 +139,6 @@ FeatureInfo::FeatureFlags::FeatureFlags()
map_buffer_range(false),
ext_discard_framebuffer(false),
angle_depth_texture(false),
- is_angle(false),
is_swiftshader(false),
angle_texture_usage(false),
ext_texture_storage(false),
@@ -271,17 +270,10 @@ void FeatureInfo::InitializeFeatures() {
const char* renderer_str =
reinterpret_cast<const char*>(glGetString(GL_RENDERER));
- if (renderer_str) {
- feature_flags_.is_angle = StartsWithASCII(renderer_str, "ANGLE", true);
- }
-
- bool is_es3 = false;
const char* version_str =
reinterpret_cast<const char*>(glGetString(GL_VERSION));
- if (version_str) {
- std::string lstr(base::StringToLowerASCII(std::string(version_str)));
- is_es3 = (lstr.substr(0, 12) == "opengl es 3.");
- }
+
+ gl_version_info_.reset(new gfx::GLVersionInfo(version_str, renderer_str));
AddExtensionString("GL_ANGLE_translated_shader_source");
AddExtensionString("GL_CHROMIUM_async_pixel_transfers");
@@ -386,7 +378,8 @@ void FeatureInfo::InitializeFeatures() {
if (!workarounds_.disable_depth_texture &&
(extensions.Contains("GL_ARB_depth_texture") ||
extensions.Contains("GL_OES_depth_texture") ||
- extensions.Contains("GL_ANGLE_depth_texture") || is_es3)) {
+ extensions.Contains("GL_ANGLE_depth_texture") ||
+ gl_version_info_->is_es3)) {
enable_depth_texture = true;
feature_flags_.angle_depth_texture =
extensions.Contains("GL_ANGLE_depth_texture");
@@ -404,7 +397,8 @@ void FeatureInfo::InitializeFeatures() {
}
if (extensions.Contains("GL_EXT_packed_depth_stencil") ||
- extensions.Contains("GL_OES_packed_depth_stencil") || is_es3) {
+ extensions.Contains("GL_OES_packed_depth_stencil") ||
+ gl_version_info_->is_es3) {
AddExtensionString("GL_OES_packed_depth_stencil");
feature_flags_.packed_depth24_stencil8 = true;
if (enable_depth_texture) {
@@ -417,7 +411,8 @@ void FeatureInfo::InitializeFeatures() {
validators_.render_buffer_format.AddValue(GL_DEPTH24_STENCIL8);
}
- if (is_es3 || extensions.Contains("GL_OES_vertex_array_object") ||
+ if (gl_version_info_->is_es3 ||
+ extensions.Contains("GL_OES_vertex_array_object") ||
extensions.Contains("GL_ARB_vertex_array_object") ||
extensions.Contains("GL_APPLE_vertex_array_object")) {
feature_flags_.native_vertex_array_object = true;
@@ -430,7 +425,8 @@ void FeatureInfo::InitializeFeatures() {
feature_flags_.native_vertex_array_object = false;
}
- if (is_es3 || extensions.Contains("GL_OES_element_index_uint") ||
+ if (gl_version_info_->is_es3 ||
+ extensions.Contains("GL_OES_element_index_uint") ||
gfx::HasDesktopGLFeatures()) {
AddExtensionString("GL_OES_element_index_uint");
validators_.index_type.AddValue(GL_UNSIGNED_INT);
@@ -442,7 +438,8 @@ void FeatureInfo::InitializeFeatures() {
// sized formats GL_SRGB8 and GL_SRGB8_ALPHA8. Also, SRGB_EXT isn't a valid
// <format> in this case. So, even with GLES3 explicitly check for
// GL_EXT_sRGB.
- if (((is_es3 || extensions.Contains("GL_OES_rgb8_rgba8")) &&
+ if (((gl_version_info_->is_es3 ||
+ extensions.Contains("GL_OES_rgb8_rgba8")) &&
extensions.Contains("GL_EXT_sRGB")) || gfx::HasDesktopGLFeatures()) {
AddExtensionString("GL_EXT_sRGB");
texture_format_validators_[GL_SRGB_EXT].AddValue(GL_UNSIGNED_BYTE);
@@ -503,7 +500,8 @@ void FeatureInfo::InitializeFeatures() {
}
// Check if we should allow GL_OES_texture_npot
- if (is_es3 || extensions.Contains("GL_ARB_texture_non_power_of_two") ||
+ if (gl_version_info_->is_es3 ||
+ extensions.Contains("GL_ARB_texture_non_power_of_two") ||
extensions.Contains("GL_OES_texture_npot")) {
AddExtensionString("GL_OES_texture_npot");
feature_flags_.npot_ok = true;
@@ -535,8 +533,9 @@ void FeatureInfo::InitializeFeatures() {
// This extension allows a variety of floating point formats to be
// rendered to via framebuffer objects. Enable it's usage only if
// support for Floating textures is enabled.
- if ((is_es3 && extensions.Contains("GL_EXT_color_buffer_float")) ||
- feature_flags_.is_angle) {
+ if ((gl_version_info_->is_es3 &&
+ extensions.Contains("GL_EXT_color_buffer_float")) ||
+ gl_version_info_->is_angle) {
may_enable_chromium_color_buffer_float = true;
}
}
@@ -638,12 +637,13 @@ void FeatureInfo::InitializeFeatures() {
// Check for multisample support
if (!workarounds_.disable_multisampling) {
bool ext_has_multisample =
- extensions.Contains("GL_EXT_framebuffer_multisample") || is_es3;
- if (feature_flags_.is_angle) {
+ extensions.Contains("GL_EXT_framebuffer_multisample") ||
+ gl_version_info_->is_es3;
+ if (gl_version_info_->is_angle) {
ext_has_multisample |=
extensions.Contains("GL_ANGLE_framebuffer_multisample");
}
- feature_flags_.use_core_framebuffer_multisample = is_es3;
+ feature_flags_.use_core_framebuffer_multisample = gl_version_info_->is_es3;
if (ext_has_multisample) {
feature_flags_.chromium_framebuffer_multisample = true;
validators_.frame_buffer_target.AddValue(GL_READ_FRAMEBUFFER_EXT);
@@ -670,14 +670,15 @@ void FeatureInfo::InitializeFeatures() {
}
if (extensions.Contains("GL_OES_depth24") || gfx::HasDesktopGLFeatures() ||
- is_es3) {
+ gl_version_info_->is_es3) {
AddExtensionString("GL_OES_depth24");
feature_flags_.oes_depth24 = true;
validators_.render_buffer_format.AddValue(GL_DEPTH_COMPONENT24);
}
if (!workarounds_.disable_oes_standard_derivatives &&
- (is_es3 || extensions.Contains("GL_OES_standard_derivatives") ||
+ (gl_version_info_->is_es3 ||
+ extensions.Contains("GL_OES_standard_derivatives") ||
gfx::HasDesktopGLFeatures())) {
AddExtensionString("GL_OES_standard_derivatives");
feature_flags_.oes_standard_derivatives = true;
@@ -771,8 +772,10 @@ void FeatureInfo::InitializeFeatures() {
// However we expose GL_EXT_texture_storage when just ES3 because we don't
// claim to handle GL_BGRA8.
bool support_texture_storage_on_es3 =
- (is_es3 && enable_immutable_texture_format_bgra_on_es3) ||
- (is_es3 && !enable_texture_format_bgra8888);
+ (gl_version_info_->is_es3 &&
+ enable_immutable_texture_format_bgra_on_es3) ||
+ (gl_version_info_->is_es3 &&
+ !enable_texture_format_bgra8888);
if (extensions.Contains("GL_EXT_texture_storage") ||
extensions.Contains("GL_ARB_texture_storage") ||
support_texture_storage_on_es3) {
@@ -825,7 +828,7 @@ void FeatureInfo::InitializeFeatures() {
(extensions.Contains("GL_ANGLE_instanced_arrays") ||
(extensions.Contains("GL_ARB_instanced_arrays") &&
extensions.Contains("GL_ARB_draw_instanced")) ||
- is_es3)) {
+ gl_version_info_->is_es3)) {
AddExtensionString("GL_ANGLE_instanced_arrays");
feature_flags_.angle_instanced_arrays = true;
validators_.vertex_attribute.AddValue(GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE);
@@ -836,7 +839,8 @@ void FeatureInfo::InitializeFeatures() {
extensions.Contains("GL_EXT_draw_buffers");
if (!workarounds_.disable_ext_draw_buffers &&
(vendor_agnostic_draw_buffers ||
- (extensions.Contains("GL_NV_draw_buffers") && is_es3))) {
+ (extensions.Contains("GL_NV_draw_buffers") &&
+ gl_version_info_->is_es3))) {
AddExtensionString("GL_EXT_draw_buffers");
feature_flags_.ext_draw_buffers = true;
@@ -871,7 +875,8 @@ void FeatureInfo::InitializeFeatures() {
}
}
- if (is_es3 || extensions.Contains("GL_EXT_blend_minmax") ||
+ if (gl_version_info_->is_es3 ||
+ extensions.Contains("GL_EXT_blend_minmax") ||
gfx::HasDesktopGLFeatures()) {
AddExtensionString("GL_EXT_blend_minmax");
validators_.equation.AddValue(GL_MIN_EXT);
@@ -906,13 +911,15 @@ void FeatureInfo::InitializeFeatures() {
UMA_HISTOGRAM_BOOLEAN("GPU.FenceSupport", ui_gl_fence_works);
feature_flags_.map_buffer_range =
- is_es3 || extensions.Contains("GL_ARB_map_buffer_range") ||
+ gl_version_info_->is_es3 ||
+ extensions.Contains("GL_ARB_map_buffer_range") ||
extensions.Contains("GL_EXT_map_buffer_range");
// Really it's part of core OpenGL 2.1 and up, but let's assume the
// extension is still advertised.
bool has_pixel_buffers =
- is_es3 || extensions.Contains("GL_ARB_pixel_buffer_object") ||
+ gl_version_info_->is_es3 ||
+ extensions.Contains("GL_ARB_pixel_buffer_object") ||
extensions.Contains("GL_NV_pixel_buffer_object");
// We will use either glMapBuffer() or glMapBufferRange() for async readbacks.
@@ -921,13 +928,15 @@ void FeatureInfo::InitializeFeatures() {
feature_flags_.use_async_readpixels = true;
}
- if (is_es3 || extensions.Contains("GL_ARB_sampler_objects")) {
+ if (gl_version_info_->is_es3 ||
+ extensions.Contains("GL_ARB_sampler_objects")) {
feature_flags_.enable_samplers = true;
// TODO(dsinclair): Add AddExtensionString("GL_CHROMIUM_sampler_objects")
// when available.
}
- if ((is_es3 || extensions.Contains("GL_EXT_discard_framebuffer")) &&
+ if ((gl_version_info_->is_es3 ||
+ extensions.Contains("GL_EXT_discard_framebuffer")) &&
!workarounds_.disable_ext_discard_framebuffer) {
// DiscardFramebufferEXT is automatically bound to InvalidateFramebuffer.
AddExtensionString("GL_EXT_discard_framebuffer");
@@ -974,7 +983,8 @@ void FeatureInfo::InitializeFeatures() {
}
if (extensions.Contains("GL_NV_path_rendering")) {
- if (extensions.Contains("GL_EXT_direct_state_access") || is_es3) {
+ if (extensions.Contains("GL_EXT_direct_state_access") ||
+ gl_version_info_->is_es3) {
AddExtensionString("GL_CHROMIUM_path_rendering");
feature_flags_.chromium_path_rendering = true;
validators_.g_l_state.AddValue(GL_PATH_MODELVIEW_MATRIX_CHROMIUM);
@@ -982,7 +992,7 @@ void FeatureInfo::InitializeFeatures() {
}
}
- if ((is_es3 || extensions.Contains("GL_EXT_texture_rg") ||
+ if ((gl_version_info_->is_es3 || extensions.Contains("GL_EXT_texture_rg") ||
extensions.Contains("GL_ARB_texture_rg")) &&
IsGL_REDSupportedOnFBOs()) {
feature_flags_.ext_texture_rg = true;
diff --git a/gpu/command_buffer/service/feature_info.h b/gpu/command_buffer/service/feature_info.h
index 816ab49..c4bf479 100644
--- a/gpu/command_buffer/service/feature_info.h
+++ b/gpu/command_buffer/service/feature_info.h
@@ -14,6 +14,7 @@
#include "gpu/command_buffer/service/gles2_cmd_validation.h"
#include "gpu/config/gpu_driver_bug_workaround_type.h"
#include "gpu/gpu_export.h"
+#include "ui/gl/gl_version_info.h"
namespace base {
class CommandLine;
@@ -66,7 +67,6 @@ class GPU_EXPORT FeatureInfo : public base::RefCounted<FeatureInfo> {
bool map_buffer_range;
bool ext_discard_framebuffer;
bool angle_depth_texture;
- bool is_angle;
bool is_swiftshader;
bool angle_texture_usage;
bool ext_texture_storage;
@@ -122,6 +122,11 @@ class GPU_EXPORT FeatureInfo : public base::RefCounted<FeatureInfo> {
return workarounds_;
}
+ const gfx::GLVersionInfo& gl_version_info() const {
+ CHECK(gl_version_info_.get());
+ return *(gl_version_info_.get());
+ }
+
private:
friend class base::RefCounted<FeatureInfo>;
friend class BufferManagerClientSideArraysTest;
@@ -148,6 +153,8 @@ class GPU_EXPORT FeatureInfo : public base::RefCounted<FeatureInfo> {
// Flags for Workarounds.
Workarounds workarounds_;
+ scoped_ptr<gfx::GLVersionInfo> gl_version_info_;
+
DISALLOW_COPY_AND_ASSIGN(FeatureInfo);
};
diff --git a/gpu/command_buffer/service/feature_info_unittest.cc b/gpu/command_buffer/service/feature_info_unittest.cc
index b314262..06f3d11 100644
--- a/gpu/command_buffer/service/feature_info_unittest.cc
+++ b/gpu/command_buffer/service/feature_info_unittest.cc
@@ -127,7 +127,6 @@ TEST_F(FeatureInfoTest, Basic) {
EXPECT_FALSE(info_->feature_flags().nv_draw_buffers);
EXPECT_FALSE(info_->feature_flags().ext_discard_framebuffer);
EXPECT_FALSE(info_->feature_flags().angle_depth_texture);
- EXPECT_FALSE(info_->feature_flags().is_angle);
#define GPU_OP(type, name) EXPECT_FALSE(info_->workarounds().name);
GPU_DRIVER_BUG_WORKAROUNDS(GPU_OP)
@@ -345,7 +344,7 @@ TEST_F(FeatureInfoTest, InitializeNoExtensions) {
TEST_F(FeatureInfoTest, InitializeWithANGLE) {
SetupInitExpectationsWithGLVersion("", kGLRendererStringANGLE, "");
- EXPECT_TRUE(info_->feature_flags().is_angle);
+ EXPECT_TRUE(info_->gl_version_info().is_angle);
}
TEST_F(FeatureInfoTest, InitializeNPOTExtensionGLES) {
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index 422168c..919d8d8 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -4494,7 +4494,13 @@ void GLES2DecoderImpl::DoDiscardFramebufferEXT(GLenum target,
}
ScopedRenderTo do_render(framebuffer);
- glDiscardFramebufferEXT(target, numAttachments, translated_attachments.get());
+ if (feature_info_->gl_version_info().is_es3) {
+ glInvalidateFramebuffer(
+ target, numAttachments, translated_attachments.get());
+ } else {
+ glDiscardFramebufferEXT(
+ target, numAttachments, translated_attachments.get());
+ }
}
void GLES2DecoderImpl::DoEnableVertexAttribArray(GLuint index) {
@@ -5495,7 +5501,7 @@ void GLES2DecoderImpl::RenderbufferStorageMultisampleHelper(
GLsizei height) {
// TODO(sievers): This could be resolved at the GL binding level, but the
// binding process is currently a bit too 'brute force'.
- if (feature_info->feature_flags().is_angle) {
+ if (feature_info->gl_version_info().is_angle) {
glRenderbufferStorageMultisampleANGLE(
target, samples, internal_format, width, height);
} else if (feature_info->feature_flags().use_core_framebuffer_multisample) {
@@ -5519,7 +5525,7 @@ void GLES2DecoderImpl::BlitFramebufferHelper(GLint srcX0,
GLenum filter) {
// TODO(sievers): This could be resolved at the GL binding level, but the
// binding process is currently a bit too 'brute force'.
- if (feature_info_->feature_flags().is_angle) {
+ if (feature_info_->gl_version_info().is_angle) {
glBlitFramebufferANGLE(
srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
} else if (feature_info_->feature_flags().use_core_framebuffer_multisample) {
@@ -7865,8 +7871,8 @@ error::Error GLES2DecoderImpl::HandleReadPixels(uint32 immediate_data_size,
glGenBuffersARB(1, &buffer);
glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, buffer);
// For ANGLE client version 2, GL_STREAM_READ is not available.
- const GLenum usage_hint =
- features().is_angle ? GL_STATIC_DRAW : GL_STREAM_READ;
+ const GLenum usage_hint = feature_info_->gl_version_info().is_angle ?
+ GL_STATIC_DRAW : GL_STREAM_READ;
glBufferData(GL_PIXEL_PACK_BUFFER_ARB, pixels_size, NULL, usage_hint);
GLenum error = glGetError();
if (error == GL_NO_ERROR) {
@@ -9703,7 +9709,7 @@ void GLES2DecoderImpl::DoSwapBuffers() {
// Ensure the side effects of the copy are visible to the parent
// context. There is no need to do this for ANGLE because it uses a
// single D3D device for all contexts.
- if (!feature_info_->feature_flags().is_angle)
+ if (!feature_info_->gl_version_info().is_angle)
glFlush();
}
} else {
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
index ebdb625..b84fc2a 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
@@ -1493,6 +1493,74 @@ error::Error GLES2DecoderImpl::HandleHint(uint32_t immediate_data_size,
return error::kNoError;
}
+error::Error GLES2DecoderImpl::HandleInvalidateFramebufferImmediate(
+ uint32_t immediate_data_size,
+ const void* cmd_data) {
+ if (!unsafe_es3_apis_enabled())
+ return error::kUnknownCommand;
+ const gles2::cmds::InvalidateFramebufferImmediate& c =
+ *static_cast<const gles2::cmds::InvalidateFramebufferImmediate*>(
+ cmd_data);
+ (void)c;
+ GLenum target = static_cast<GLenum>(c.target);
+ GLsizei count = static_cast<GLsizei>(c.count);
+ uint32_t data_size;
+ if (!ComputeDataSize(count, sizeof(GLenum), 1, &data_size)) {
+ return error::kOutOfBounds;
+ }
+ if (data_size > immediate_data_size) {
+ return error::kOutOfBounds;
+ }
+ const GLenum* attachments =
+ GetImmediateDataAs<const GLenum*>(c, data_size, immediate_data_size);
+ if (attachments == NULL) {
+ return error::kOutOfBounds;
+ }
+ glInvalidateFramebuffer(target, count, attachments);
+ return error::kNoError;
+}
+
+error::Error GLES2DecoderImpl::HandleInvalidateSubFramebufferImmediate(
+ uint32_t immediate_data_size,
+ const void* cmd_data) {
+ if (!unsafe_es3_apis_enabled())
+ return error::kUnknownCommand;
+ const gles2::cmds::InvalidateSubFramebufferImmediate& c =
+ *static_cast<const gles2::cmds::InvalidateSubFramebufferImmediate*>(
+ cmd_data);
+ (void)c;
+ GLenum target = static_cast<GLenum>(c.target);
+ GLsizei count = static_cast<GLsizei>(c.count);
+ uint32_t data_size;
+ if (!ComputeDataSize(count, sizeof(GLenum), 1, &data_size)) {
+ return error::kOutOfBounds;
+ }
+ if (data_size > immediate_data_size) {
+ return error::kOutOfBounds;
+ }
+ const GLenum* attachments =
+ GetImmediateDataAs<const GLenum*>(c, data_size, immediate_data_size);
+ GLint x = static_cast<GLint>(c.x);
+ GLint y = static_cast<GLint>(c.y);
+ GLsizei width = static_cast<GLsizei>(c.width);
+ GLsizei height = static_cast<GLsizei>(c.height);
+ if (attachments == NULL) {
+ return error::kOutOfBounds;
+ }
+ if (width < 0) {
+ LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glInvalidateSubFramebuffer",
+ "width < 0");
+ return error::kNoError;
+ }
+ if (height < 0) {
+ LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glInvalidateSubFramebuffer",
+ "height < 0");
+ return error::kNoError;
+ }
+ glInvalidateSubFramebuffer(target, count, attachments, x, y, width, height);
+ return error::kNoError;
+}
+
error::Error GLES2DecoderImpl::HandleIsBuffer(uint32_t immediate_data_size,
const void* cmd_data) {
const gles2::cmds::IsBuffer& c =
@@ -1653,6 +1721,18 @@ error::Error GLES2DecoderImpl::HandlePolygonOffset(uint32_t immediate_data_size,
return error::kNoError;
}
+error::Error GLES2DecoderImpl::HandleReadBuffer(uint32_t immediate_data_size,
+ const void* cmd_data) {
+ if (!unsafe_es3_apis_enabled())
+ return error::kUnknownCommand;
+ const gles2::cmds::ReadBuffer& c =
+ *static_cast<const gles2::cmds::ReadBuffer*>(cmd_data);
+ (void)c;
+ GLenum src = static_cast<GLenum>(c.src);
+ glReadBuffer(src);
+ return error::kNoError;
+}
+
error::Error GLES2DecoderImpl::HandleReleaseShaderCompiler(
uint32_t immediate_data_size,
const void* cmd_data) {
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1_autogen.h b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1_autogen.h
index f9b450e..014007a 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1_autogen.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1_autogen.h
@@ -1698,6 +1698,8 @@ TEST_P(GLES2DecoderTest1, HintInvalidArgs0_0) {
EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
}
+// TODO(gman): InvalidateFramebufferImmediate
+// TODO(gman): InvalidateSubFramebufferImmediate
TEST_P(GLES2DecoderTest1, IsBufferValidArgs) {
SpecializedSetup<cmds::IsBuffer, 0>(true);
@@ -1875,14 +1877,4 @@ TEST_P(GLES2DecoderTest1, LinkProgramValidArgs) {
}
// TODO(gman): PixelStorei
-TEST_P(GLES2DecoderTest1, PolygonOffsetValidArgs) {
- EXPECT_CALL(*gl_, PolygonOffset(1, 2));
- SpecializedSetup<cmds::PolygonOffset, 0>(true);
- cmds::PolygonOffset cmd;
- cmd.Init(1, 2);
- EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
- EXPECT_EQ(GL_NO_ERROR, GetGLError());
-}
-// TODO(gman): ReadPixels
-
#endif // GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_UNITTEST_1_AUTOGEN_H_
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_2_autogen.h b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_2_autogen.h
index b69197f..602be42 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_2_autogen.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_2_autogen.h
@@ -12,6 +12,28 @@
#ifndef GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_UNITTEST_2_AUTOGEN_H_
#define GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_UNITTEST_2_AUTOGEN_H_
+TEST_P(GLES2DecoderTest2, PolygonOffsetValidArgs) {
+ EXPECT_CALL(*gl_, PolygonOffset(1, 2));
+ SpecializedSetup<cmds::PolygonOffset, 0>(true);
+ cmds::PolygonOffset cmd;
+ cmd.Init(1, 2);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+}
+
+TEST_P(GLES2DecoderTest2, ReadBufferValidArgs) {
+ EXPECT_CALL(*gl_, ReadBuffer(1));
+ SpecializedSetup<cmds::ReadBuffer, 0>(true);
+ cmds::ReadBuffer cmd;
+ cmd.Init(1);
+ decoder_->set_unsafe_es3_apis_enabled(true);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+ decoder_->set_unsafe_es3_apis_enabled(false);
+ EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd));
+}
+// TODO(gman): ReadPixels
+
// TODO(gman): ReleaseShaderCompiler
TEST_P(GLES2DecoderTest2, RenderbufferStorageValidArgs) {
@@ -1015,7 +1037,4 @@ TEST_P(GLES2DecoderTest2, PopGroupMarkerEXTValidArgs) {
// TODO(gman): GetTranslatedShaderSourceANGLE
// TODO(gman): PostSubBufferCHROMIUM
// TODO(gman): TexImageIOSurface2DCHROMIUM
-// TODO(gman): CopyTextureCHROMIUM
-// TODO(gman): DrawArraysInstancedANGLE
-// TODO(gman): DrawElementsInstancedANGLE
#endif // GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_UNITTEST_2_AUTOGEN_H_
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_3_autogen.h b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_3_autogen.h
index 0ee2ba5..4509676 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_3_autogen.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_3_autogen.h
@@ -12,6 +12,9 @@
#ifndef GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_UNITTEST_3_AUTOGEN_H_
#define GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_UNITTEST_3_AUTOGEN_H_
+// TODO(gman): CopyTextureCHROMIUM
+// TODO(gman): DrawArraysInstancedANGLE
+// TODO(gman): DrawElementsInstancedANGLE
// TODO(gman): VertexAttribDivisorANGLE
// TODO(gman): GenMailboxCHROMIUM
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_framebuffers.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_framebuffers.cc
index 78fa020..d230be78f 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_framebuffers.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_framebuffers.cc
@@ -2120,7 +2120,7 @@ TEST_P(GLES2DecoderManualInitTest, InvalidateFramebufferBinding) {
// EXPECT_EQ can't be used to compare function pointers
EXPECT_TRUE(
- gfx::MockGLInterface::GetGLProcAddress("glInvalidateFramebuffer") ==
+ gfx::MockGLInterface::GetGLProcAddress("glInvalidateFramebuffer") !=
gfx::g_driver_gl.fn.glDiscardFramebufferEXTFn);
EXPECT_TRUE(
gfx::MockGLInterface::GetGLProcAddress("glInvalidateFramebuffer") !=