diff options
author | kloveless@chromium.org <kloveless@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-17 15:40:13 +0000 |
---|---|---|
committer | kloveless@chromium.org <kloveless@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-17 15:40:13 +0000 |
commit | 0fbba3739fc9612efc44bcbdeb60a3abfd6a019b (patch) | |
tree | 20719d3f82ca95b5379812cdaea20400302572f8 /gpu | |
parent | 1b4f67a827103f53b8525b2a993ad0ea709da165 (diff) | |
download | chromium_src-0fbba3739fc9612efc44bcbdeb60a3abfd6a019b.zip chromium_src-0fbba3739fc9612efc44bcbdeb60a3abfd6a019b.tar.gz chromium_src-0fbba3739fc9612efc44bcbdeb60a3abfd6a019b.tar.bz2 |
Move glBufferData, glBufferSubData and glGetBufferParameteriv into the Buffer Manager more completely.
BUG=
Review URL: https://chromiumcodereview.appspot.com/19269004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@212050 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu')
-rw-r--r-- | gpu/command_buffer/service/buffer_manager.cc | 85 | ||||
-rw-r--r-- | gpu/command_buffer/service/buffer_manager.h | 54 | ||||
-rw-r--r-- | gpu/command_buffer/service/gles2_cmd_decoder.cc | 77 |
3 files changed, 132 insertions, 84 deletions
diff --git a/gpu/command_buffer/service/buffer_manager.cc b/gpu/command_buffer/service/buffer_manager.cc index cd1cb2a..f9cec7a 100644 --- a/gpu/command_buffer/service/buffer_manager.cc +++ b/gpu/command_buffer/service/buffer_manager.cc @@ -7,6 +7,7 @@ #include "base/debug/trace_event.h" #include "base/logging.h" #include "gpu/command_buffer/common/gles2_cmd_utils.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/memory_tracking.h" @@ -258,6 +259,43 @@ void BufferManager::SetInfo( memory_tracker_->TrackMemAlloc(buffer->size()); } +void BufferManager::ValidateAndDoBufferData( + ContextState* context_state, GLenum target, GLsizeiptr size, + const GLvoid * data, GLenum usage) { + ErrorState* error_state = context_state->GetErrorState(); + if (!feature_info_->validators()->buffer_target.IsValid(target)) { + ERRORSTATE_SET_GL_ERROR_INVALID_ENUM( + error_state, "glBufferData", target, "target"); + return; + } + if (!feature_info_->validators()->buffer_usage.IsValid(usage)) { + ERRORSTATE_SET_GL_ERROR_INVALID_ENUM( + error_state, "glBufferData", usage, "usage"); + return; + } + if (size < 0) { + ERRORSTATE_SET_GL_ERROR( + error_state, GL_INVALID_VALUE, "glBufferData", "size < 0"); + return; + } + + Buffer* buffer = GetBufferInfoForTarget(context_state, target); + if (!buffer) { + ERRORSTATE_SET_GL_ERROR( + error_state, GL_INVALID_VALUE, "glBufferData", "unknown buffer"); + return; + } + + if (!memory_tracker_->EnsureGPUMemoryAvailable(size)) { + ERRORSTATE_SET_GL_ERROR( + error_state, GL_OUT_OF_MEMORY, "glBufferData", "out of memory"); + return; + } + + DoBufferData(error_state, buffer, size, usage, data); +} + + void BufferManager::DoBufferData( ErrorState* error_state, Buffer* buffer, @@ -287,6 +325,20 @@ void BufferManager::DoBufferData( } } +void BufferManager::ValidateAndDoBufferSubData( + ContextState* context_state, GLenum target, GLintptr offset, GLsizeiptr size, + const GLvoid * data) { + ErrorState* error_state = context_state->GetErrorState(); + Buffer* buffer = GetBufferInfoForTarget(context_state, target); + if (!buffer) { + ERRORSTATE_SET_GL_ERROR(error_state, GL_INVALID_VALUE, "glBufferSubData", + "unknown buffer"); + return; + } + + DoBufferSubData(error_state, buffer, offset, size, data); +} + void BufferManager::DoBufferSubData( ErrorState* error_state, Buffer* buffer, @@ -304,6 +356,27 @@ void BufferManager::DoBufferSubData( } } +void BufferManager::ValidateAndDoGetBufferParameteriv( + ContextState* context_state, GLenum target, GLenum pname, GLint* params) { + Buffer* buffer = GetBufferInfoForTarget(context_state, target); + if (!buffer) { + ERRORSTATE_SET_GL_ERROR( + context_state->GetErrorState(), GL_INVALID_OPERATION, + "glGetBufferParameteriv", "no buffer bound for target"); + return; + } + switch (pname) { + case GL_BUFFER_SIZE: + *params = buffer->size(); + break; + case GL_BUFFER_USAGE: + *params = buffer->usage(); + break; + default: + NOTREACHED(); + } +} + bool BufferManager::SetTarget(Buffer* buffer, GLenum target) { // Check that we are not trying to bind it to a different target. if (buffer->target() != 0 && buffer->target() != target && @@ -316,6 +389,18 @@ bool BufferManager::SetTarget(Buffer* buffer, GLenum target) { return true; } +// Since one BufferManager can be shared by multiple decoders, ContextState is +// passed in each time and not just passed in during initialization. +Buffer* BufferManager::GetBufferInfoForTarget( + ContextState* state, GLenum target) { + DCHECK(target == GL_ARRAY_BUFFER || target == GL_ELEMENT_ARRAY_BUFFER); + if (target == GL_ARRAY_BUFFER) { + return state->bound_array_buffer.get(); + } else { + return state->vertex_attrib_manager->element_array_buffer(); + } +} + } // namespace gles2 } // namespace gpu diff --git a/gpu/command_buffer/service/buffer_manager.h b/gpu/command_buffer/service/buffer_manager.h index 313ced6..8ddf334 100644 --- a/gpu/command_buffer/service/buffer_manager.h +++ b/gpu/command_buffer/service/buffer_manager.h @@ -19,8 +19,10 @@ namespace gpu { namespace gles2 { class BufferManager; +struct ContextState; class ErrorState; class FeatureInfo; +class TestHelper; // Info about Buffers currently in the system. class GPU_EXPORT Buffer : public base::RefCounted<Buffer> { @@ -191,22 +193,22 @@ class GPU_EXPORT BufferManager { // Gets a client id for a given service id. bool GetClientId(GLuint service_id, GLuint* client_id) const; - // Does a glBufferData and updates the approprate accounting. Currently - // assume the values have already been validated. - void DoBufferData( - ErrorState* error_state, - Buffer* buffer, - GLsizeiptr size, - GLenum usage, - const GLvoid* data); + // Validates a glBufferSubData, and then calls DoBufferData if validation was + // successful. + void ValidateAndDoBufferSubData( + ContextState* context_state, GLenum target, GLintptr offset, + GLsizeiptr size, const GLvoid * data); - // Does a glBufferSubData and updates the approrate accounting. - void DoBufferSubData( - ErrorState* error_state, - Buffer* buffer, - GLintptr offset, - GLsizeiptr size, - const GLvoid* data); + // Validates a glBufferData, and then calls DoBufferData if validation was + // successful. + void ValidateAndDoBufferData( + ContextState* context_state, GLenum target, GLsizeiptr size, + const GLvoid * data, GLenum usage); + + // Validates a glGetBufferParameteriv, and then calls GetBufferParameteriv if + // validation was successful. + void ValidateAndDoGetBufferParameteriv( + ContextState* context_state, GLenum target, GLenum pname, GLint* params); // Sets the target of a buffer. Returns false if the target can not be set. bool SetTarget(Buffer* buffer, GLenum target); @@ -228,9 +230,31 @@ class GPU_EXPORT BufferManager { private: friend class Buffer; + friend class TestHelper; // Needs access to DoBufferData. + friend class BufferManagerTestBase; // Needs access to DoBufferSubData. void StartTracking(Buffer* buffer); void StopTracking(Buffer* buffer); + Buffer* GetBufferInfoForTarget(ContextState* state, GLenum target); + + // Does a glBufferSubData and updates the approriate accounting. + // Assumes the values have already been validated. + void DoBufferSubData( + ErrorState* error_state, + Buffer* buffer, + GLintptr offset, + GLsizeiptr size, + const GLvoid* data); + + // Does a glBufferData and updates the approprate accounting. Currently + // Assumes the values have already been validated. + void DoBufferData( + ErrorState* error_state, + Buffer* buffer, + GLsizeiptr size, + GLenum usage, + const GLvoid* data); + // Sets the size, usage and initial data of a buffer. // If data is NULL buffer will be initialized to 0 if shadowed. void SetInfo( diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc index f1f024c..3c49a73 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc @@ -1169,10 +1169,6 @@ class GLES2DecoderImpl : public GLES2Decoder { GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); - // Wrapper for glBufferData. - void DoBufferData( - GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage); - // Wrapper for glBufferSubData. void DoBufferSubData( GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid * data); @@ -1411,16 +1407,6 @@ class GLES2DecoderImpl : public GLES2Decoder { bool instanced, GLenum mode, GLsizei count, GLenum type, int32 offset, GLsizei primcount); - // Gets the buffer id for a given target. - Buffer* GetBufferInfoForTarget(GLenum target) { - DCHECK(target == GL_ARRAY_BUFFER || target == GL_ELEMENT_ARRAY_BUFFER); - if (target == GL_ARRAY_BUFFER) { - return state_.bound_array_buffer.get(); - } else { - return state_.vertex_attrib_manager->element_array_buffer(); - } - } - // Gets the texture id for a given target. TextureRef* GetTextureInfoForTarget(GLenum target) { TextureUnit& unit = state_.texture_units[state_.active_texture_unit]; @@ -4416,23 +4402,9 @@ void GLES2DecoderImpl::DoGetProgramiv( void GLES2DecoderImpl::DoGetBufferParameteriv( GLenum target, GLenum pname, GLint* params) { - Buffer* buffer = GetBufferInfoForTarget(target); - if (!buffer) { - LOCAL_SET_GL_ERROR( - GL_INVALID_OPERATION, "glGetBufferParameteriv", - "no buffer bound for target"); - return; - } - switch (pname) { - case GL_BUFFER_SIZE: - *params = buffer->size(); - break; - case GL_BUFFER_USAGE: - *params = buffer->usage(); - break; - default: - NOTREACHED(); - } + // Just delegate it. Some validation is actually done before this. + buffer_manager()->ValidateAndDoGetBufferParameteriv( + &state_, target, pname, params); } void GLES2DecoderImpl::DoBindAttribLocation( @@ -7233,34 +7205,6 @@ error::Error GLES2DecoderImpl::HandleGetString( return error::kNoError; } -void GLES2DecoderImpl::DoBufferData( - GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage) { - if (!validators_->buffer_target.IsValid(target)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glBufferData", target, "target"); - return; - } - if (!validators_->buffer_usage.IsValid(usage)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glBufferData", usage, "usage"); - return; - } - if (size < 0) { - LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glBufferData", "size < 0"); - return; - } - Buffer* buffer = GetBufferInfoForTarget(target); - if (!buffer) { - LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glBufferData", "unknown buffer"); - return; - } - - if (!EnsureGPUMemoryAvailable(size)) { - LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, "glBufferData", "out of memory"); - return; - } - - buffer_manager()->DoBufferData(GetErrorState(), buffer, size, usage, data); -} - error::Error GLES2DecoderImpl::HandleBufferData( uint32 immediate_data_size, const cmds::BufferData& c) { GLenum target = static_cast<GLenum>(c.target); @@ -7275,7 +7219,7 @@ error::Error GLES2DecoderImpl::HandleBufferData( return error::kOutOfBounds; } } - DoBufferData(target, size, data, usage); + buffer_manager()->ValidateAndDoBufferData(&state_, target, size, data, usage); return error::kNoError; } @@ -7289,20 +7233,15 @@ error::Error GLES2DecoderImpl::HandleBufferDataImmediate( return error::kOutOfBounds; } GLenum usage = static_cast<GLenum>(c.usage); - DoBufferData(target, size, data, usage); + buffer_manager()->ValidateAndDoBufferData(&state_, target, size, data, usage); return error::kNoError; } void GLES2DecoderImpl::DoBufferSubData( GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid * data) { - Buffer* buffer = GetBufferInfoForTarget(target); - if (!buffer) { - LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glBufferSubData", "unknown buffer"); - return; - } - - buffer_manager()->DoBufferSubData(GetErrorState(), buffer, offset, size, - data); + // Just delegate it. Some validation is actually done before this. + buffer_manager()->ValidateAndDoBufferSubData( + &state_, target, offset, size, data); } bool GLES2DecoderImpl::ClearLevel( |