summaryrefslogtreecommitdiffstats
path: root/gpu
diff options
context:
space:
mode:
authorkloveless@chromium.org <kloveless@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-17 15:40:13 +0000
committerkloveless@chromium.org <kloveless@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-17 15:40:13 +0000
commit0fbba3739fc9612efc44bcbdeb60a3abfd6a019b (patch)
tree20719d3f82ca95b5379812cdaea20400302572f8 /gpu
parent1b4f67a827103f53b8525b2a993ad0ea709da165 (diff)
downloadchromium_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.cc85
-rw-r--r--gpu/command_buffer/service/buffer_manager.h54
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder.cc77
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(