Clean up of GLES2 Command Decoder by moving some of the error state into a separate class.
Review URL: https://chromiumcodereview.appspot.com/14308014
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@195002 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index 9413bd172..55ea6d5f 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -23,7 +23,6 @@
#endif
#include "base/memory/scoped_ptr.h"
#include "base/string_number_conversions.h"
-#include "base/stringprintf.h"
#include "build/build_config.h"
#define GLES2_GPU_SERVICE 1
#include "gpu/command_buffer/common/gles2_cmd_format.h"
@@ -34,6 +33,7 @@
#include "gpu/command_buffer/service/cmd_buffer_engine.h"
#include "gpu/command_buffer/service/context_group.h"
#include "gpu/command_buffer/service/context_state.h"
+#include "gpu/command_buffer/service/error_state.h"
#include "gpu/command_buffer/service/feature_info.h"
#include "gpu/command_buffer/service/framebuffer_manager.h"
#include "gpu/command_buffer/service/gl_utils.h"
@@ -42,7 +42,6 @@
#include "gpu/command_buffer/service/gpu_switches.h"
#include "gpu/command_buffer/service/gpu_tracer.h"
#include "gpu/command_buffer/service/image_manager.h"
-#include "gpu/command_buffer/service/logger.h"
#include "gpu/command_buffer/service/mailbox_manager.h"
#include "gpu/command_buffer/service/memory_tracking.h"
#include "gpu/command_buffer/service/program_manager.h"
@@ -127,17 +126,20 @@
// Local versions of the SET_GL_ERROR macros
#define LOCAL_SET_GL_ERROR(error, function_name, msg) \
- GLESDECODER_SET_GL_ERROR(this, error, function_name, msg)
+ ERRORSTATE_SET_GL_ERROR(state_.GetErrorState(), error, function_name, msg)
#define LOCAL_SET_GL_ERROR_INVALID_ENUM(function_name, value, label) \
- GLESDECODER_SET_GL_ERROR_INVALID_ENUM(this, function_name, value, label)
+ ERRORSTATE_SET_GL_ERROR_INVALID_ENUM(state_.GetErrorState(), \
+ function_name, value, label)
#define LOCAL_SET_GL_ERROR_INVALID_PARAM(error, function_name, pname) \
- GLESDECODER_SET_GL_ERROR_INVALID_PARAM(this, error, function_name, pname)
+ ERRORSTATE_SET_GL_ERROR_INVALID_PARAM(state_.GetErrorState(), error, \
+ function_name, pname)
#define LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER(function_name) \
- GLESDECODER_COPY_REAL_GL_ERRORS_TO_WRAPPER(this, function_name)
+ ERRORSTATE_COPY_REAL_GL_ERRORS_TO_WRAPPER(state_.GetErrorState(), \
+ function_name)
#define LOCAL_PEEK_GL_ERROR(function_name) \
- GLESDECODER_PEEK_GL_ERROR(this, function_name)
+ ERRORSTATE_PEEK_GL_ERROR(state_.GetErrorState(), function_name)
#define LOCAL_CLEAR_REAL_GL_ERRORS(function_name) \
- GLESDECODER_CLEARREAL_GL_ERRORS(this, function_name)
+ ERRORSTATE_CLEAR_REAL_GL_ERRORS(state_.GetErrorState(), function_name)
#define LOCAL_PERFORMANCE_WARNING(msg) \
PerformanceWarning(__FILE__, __LINE__, msg)
#define LOCAL_RENDER_WARNING(msg) \
@@ -560,8 +562,6 @@
// cmd stuff to outside this class.
class GLES2DecoderImpl : public GLES2Decoder {
public:
- static const int kMaxLogMessages = 256;
-
// Used by PrepForSetUniformByLocation to validate types.
struct BaseUniformInfo {
const GLenum* const valid_types;
@@ -639,6 +639,7 @@
const base::Callback<void(gfx::Size)>& callback) OVERRIDE;
virtual Logger* GetLogger() OVERRIDE;
+ virtual ErrorState* GetErrorState() OVERRIDE;
virtual void SetShaderCacheCallback(
const ShaderCacheCallback& callback) OVERRIDE;
@@ -656,8 +657,6 @@
virtual bool GetServiceTextureId(uint32 client_texture_id,
uint32* service_texture_id) OVERRIDE;
- virtual uint32 GetGLError() OVERRIDE;
-
virtual uint32 GetTextureUploadCount() OVERRIDE;
virtual base::TimeDelta GetTotalTextureUploadTime() OVERRIDE;
virtual base::TimeDelta GetTotalProcessingCommandsTime() OVERRIDE;
@@ -1406,34 +1405,6 @@
// false if pname is unknown.
bool GetNumValuesReturnedForGLGet(GLenum pname, GLsizei* num_values);
- virtual void SetGLError(
- const char* filename,
- int line,
- unsigned error,
- const char* function_name,
- const char* msg) OVERRIDE;
- virtual void SetGLErrorInvalidEnum(
- const char* filename,
- int line,
- const char* function_name,
- unsigned value,
- const char* label) OVERRIDE;
- // Generates a GL error for a bad parameter.
- virtual void SetGLErrorInvalidParam(
- const char* filename,
- int line,
- unsigned error,
- const char* function_name,
- unsigned pname,
- int param) OVERRIDE;
-
- virtual unsigned PeekGLError(
- const char* filename, int line, const char* function_name) OVERRIDE;
- virtual void CopyRealGLErrorsToWrapper(
- const char* filename, int line, const char* function_name) OVERRIDE;
- virtual void ClearRealGLErrors(
- const char* filename, int line, const char* function_name) OVERRIDE;
-
// Checks if the current program and vertex attributes are valid for drawing.
bool IsDrawValid(
const char* function_name, GLuint max_vertex_accessed, GLsizei primcount);
@@ -1661,9 +1632,6 @@
// Current width and height of the offscreen frame buffer.
gfx::Size offscreen_size_;
- // Current GL error bits.
- uint32 error_bits_;
-
// Util to help with GL.
GLES2Util util_;
@@ -1748,9 +1716,6 @@
bool teximage2d_faster_than_texsubimage2d_;
- // The last error message set.
- std::string last_error_;
-
// The current decoder error.
error::Error current_decoder_error_;
@@ -1814,11 +1779,12 @@
const char* function_name, GLES2DecoderImpl* decoder)
: function_name_(function_name),
decoder_(decoder) {
- GLESDECODER_COPY_REAL_GL_ERRORS_TO_WRAPPER(decoder_, function_name_);
+ ERRORSTATE_COPY_REAL_GL_ERRORS_TO_WRAPPER(decoder_->GetErrorState(),
+ function_name_);
}
ScopedGLErrorSuppressor::~ScopedGLErrorSuppressor() {
- GLESDECODER_CLEAR_REAL_GL_ERRORS(decoder_, function_name_);
+ ERRORSTATE_CLEAR_REAL_GL_ERRORS(decoder_->GetErrorState(), function_name_);
}
ScopedTexture2DBinder::ScopedTexture2DBinder(GLES2DecoderImpl* decoder,
@@ -2201,8 +2167,7 @@
: GLES2Decoder(),
group_(group),
logger_(&debug_marker_manager_),
- state_(group_->feature_info()),
- error_bits_(0),
+ state_(group_->feature_info(), &logger_),
unpack_flip_y_(false),
unpack_premultiply_alpha_(false),
unpack_unpremultiply_alpha_(false),
@@ -3088,25 +3053,25 @@
true);
parent_texture_manager->SetParameter(
"UpdateParentTextureInfo",
- this,
+ GetErrorState(),
offscreen_saved_color_texture_info_,
GL_TEXTURE_MAG_FILTER,
GL_NEAREST);
parent_texture_manager->SetParameter(
"UpdateParentTextureInfo",
- this,
+ GetErrorState(),
offscreen_saved_color_texture_info_,
GL_TEXTURE_MIN_FILTER,
GL_NEAREST);
parent_texture_manager->SetParameter(
"UpdateParentTextureInfo",
- this,
+ GetErrorState(),
offscreen_saved_color_texture_info_,
GL_TEXTURE_WRAP_S,
GL_CLAMP_TO_EDGE);
parent_texture_manager->SetParameter(
"UpdateParentTextureInfo",
- this,
+ GetErrorState(),
offscreen_saved_color_texture_info_,
GL_TEXTURE_WRAP_T,
GL_CLAMP_TO_EDGE);
@@ -3124,6 +3089,10 @@
return &logger_;
}
+ErrorState* GLES2DecoderImpl::GetErrorState() {
+ return state_.GetErrorState();
+}
+
void GLES2DecoderImpl::SetShaderCacheCallback(
const ShaderCacheCallback& callback) {
shader_cache_callback_ = callback;
@@ -5245,7 +5214,8 @@
}
texture_manager()->SetParameter(
- "glTexParameterf", this, texture, pname, static_cast<GLint>(param));
+ "glTexParameterf", GetErrorState(), texture, pname,
+ static_cast<GLint>(param));
}
void GLES2DecoderImpl::DoTexParameteri(
@@ -5257,7 +5227,7 @@
}
texture_manager()->SetParameter(
- "glTexParameteri", this, texture, pname, param);
+ "glTexParameteri", GetErrorState(), texture, pname, param);
}
void GLES2DecoderImpl::DoTexParameterfv(
@@ -5269,7 +5239,8 @@
}
texture_manager()->SetParameter(
- "glTexParameterfv", this, texture, pname, static_cast<GLint>(params[0]));
+ "glTexParameterfv", GetErrorState(), texture, pname,
+ static_cast<GLint>(params[0]));
}
void GLES2DecoderImpl::DoTexParameteriv(
@@ -5282,7 +5253,7 @@
}
texture_manager()->SetParameter(
- "glTexParameteriv", this, texture, pname, *params);
+ "glTexParameteriv", GetErrorState(), texture, pname, *params);
}
bool GLES2DecoderImpl::CheckCurrentProgram(const char* function_name) {
@@ -5693,77 +5664,6 @@
}
}
-uint32 GLES2DecoderImpl::GetGLError() {
- // Check the GL error first, then our wrapped error.
- GLenum error = glGetError();
- if (error == GL_NO_ERROR && error_bits_ != 0) {
- for (uint32 mask = 1; mask != 0; mask = mask << 1) {
- if ((error_bits_ & mask) != 0) {
- error = GLES2Util::GLErrorBitToGLError(mask);
- break;
- }
- }
- }
-
- if (error != GL_NO_ERROR) {
- // There was an error, clear the corresponding wrapped error.
- error_bits_ &= ~GLES2Util::GLErrorToErrorBit(error);
- }
- return error;
-}
-
-unsigned GLES2DecoderImpl::PeekGLError(
- const char* filename, int line, const char* function_name) {
- GLenum error = glGetError();
- if (error != GL_NO_ERROR) {
- SetGLError(filename, line, error, function_name, "");
- }
- return error;
-}
-
-void GLES2DecoderImpl::SetGLError(
- const char* filename, int line,
- unsigned error, const char* function_name, const char* msg) {
- if (msg) {
- last_error_ = msg;
- logger_.LogMessage(filename, line,
- logger_.GetLogPrefix() + ": " + std::string("GL ERROR :") +
- GLES2Util::GetStringEnum(error) + " : " +
- function_name + ": " + msg);
- }
- error_bits_ |= GLES2Util::GLErrorToErrorBit(error);
-}
-
-void GLES2DecoderImpl::SetGLErrorInvalidEnum(
- const char* filename, int line,
- const char* function_name, unsigned value, const char* label) {
- SetGLError(filename, line, GL_INVALID_ENUM, function_name,
- (std::string(label) + " was " +
- GLES2Util::GetStringEnum(value)).c_str());
-}
-
-void GLES2DecoderImpl::SetGLErrorInvalidParam(
- const char* filename,
- int line,
- unsigned error,
- const char* function_name,
- unsigned pname,
- int param) {
- if (error == GL_INVALID_ENUM) {
- SetGLError(
- filename, line, GL_INVALID_ENUM, function_name,
- (std::string("trying to set ") +
- GLES2Util::GetStringEnum(pname) + " to " +
- GLES2Util::GetStringEnum(param)).c_str());
- } else {
- SetGLError(
- filename, line, error, function_name,
- (std::string("trying to set ") +
- GLES2Util::GetStringEnum(pname) + " to " +
- base::StringPrintf("%d", param)).c_str());
- }
-}
-
void GLES2DecoderImpl::RenderWarning(
const char* filename, int line, const std::string& msg) {
logger_.LogMessage(filename, line, std::string("RENDER WARNING: ") + msg);
@@ -5771,8 +5671,8 @@
void GLES2DecoderImpl::PerformanceWarning(
const char* filename, int line, const std::string& msg) {
- logger_.LogMessage(filename, line, std::string("PERFORMANCE WARNING: ")
- + msg);
+ logger_.LogMessage(filename, line,
+ std::string("PERFORMANCE WARNING: ") + msg);
}
void GLES2DecoderImpl::ForceCompileShaderIfPending(Shader* shader) {
@@ -5792,30 +5692,6 @@
}
}
-void GLES2DecoderImpl::CopyRealGLErrorsToWrapper(
- const char* filename, int line, const char* function_name) {
- GLenum error;
- while ((error = glGetError()) != GL_NO_ERROR) {
- SetGLError(filename, line, error, function_name,
- "<- error from previous GL command");
- }
-}
-
-void GLES2DecoderImpl::ClearRealGLErrors(
- const char* filename, int line, const char* function_name) {
- GLenum error;
- while ((error = glGetError()) != GL_NO_ERROR) {
- if (error != GL_OUT_OF_MEMORY) {
- // GL_OUT_OF_MEMORY can legally happen on lost device.
- logger_.LogMessage(filename, line,
- logger_.GetLogPrefix() + ": " + std::string("GL ERROR :") +
- GLES2Util::GetStringEnum(error) + " : " +
- function_name + ": was unhandled");
- NOTREACHED() << "GL error " << error << " was unhandled.";
- }
- }
-}
-
bool GLES2DecoderImpl::SetBlackTextureForNonRenderableTextures() {
DCHECK(state_.current_program);
// Only check if there are some unrenderable textures.
@@ -7380,7 +7256,7 @@
return;
}
- buffer_manager()->DoBufferData(this, buffer, size, usage, data);
+ buffer_manager()->DoBufferData(GetErrorState(), buffer, size, usage, data);
}
error::Error GLES2DecoderImpl::HandleBufferData(
@@ -7423,7 +7299,8 @@
return;
}
- buffer_manager()->DoBufferSubData(this, buffer, offset, size, data);
+ buffer_manager()->DoBufferSubData(GetErrorState(), buffer, offset, size,
+ data);
}
bool GLES2DecoderImpl::ClearLevel(