summaryrefslogtreecommitdiffstats
path: root/gpu/command_buffer
diff options
context:
space:
mode:
Diffstat (limited to 'gpu/command_buffer')
-rw-r--r--gpu/command_buffer/client/gles2_implementation.cc59
-rw-r--r--gpu/command_buffer/client/gles2_implementation.h74
-rw-r--r--gpu/command_buffer/client/gles2_implementation_unittest.cc12
3 files changed, 51 insertions, 94 deletions
diff --git a/gpu/command_buffer/client/gles2_implementation.cc b/gpu/command_buffer/client/gles2_implementation.cc
index 77dee21..0d5cd70 100644
--- a/gpu/command_buffer/client/gles2_implementation.cc
+++ b/gpu/command_buffer/client/gles2_implementation.cc
@@ -10,6 +10,10 @@
#include "../common/gles2_cmd_utils.h"
#include "../common/id_allocator.h"
+#if defined(__native_client__) && !defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
+#define GLES2_SUPPORT_CLIENT_SIDE_ARRAYS
+#endif
+
namespace gpu {
namespace gles2 {
@@ -18,12 +22,6 @@ static GLuint ToGLuint(const void* ptr) {
return static_cast<GLuint>(reinterpret_cast<size_t>(ptr));
}
-#if defined(GLES2_SUPPORT_CLIENT_SIDE_BUFFERS)
-
-static GLsizei RoundUpToMultipleOf4(GLsizei size) {
- return (size + 3) & ~3;
-}
-
// An id handler for non-shared ids.
class NonSharedIdHandler : public IdHandlerInterface {
public:
@@ -117,6 +115,10 @@ class SharedIdHandler : public IdHandlerInterface {
id_namespaces::IdNamespaces id_namespace_;
};
+static GLsizei RoundUpToMultipleOf4(GLsizei size) {
+ return (size + 3) & ~3;
+}
+
// This class tracks VertexAttribPointers and helps emulate client side buffers.
//
// The way client side buffers work is we shadow all the Vertex Attribs so we
@@ -413,9 +415,6 @@ class ClientSideBufferHelper {
DISALLOW_COPY_AND_ASSIGN(ClientSideBufferHelper);
};
-#endif // defined(GLES2_SUPPORT_CLIENT_SIDE_BUFFERS)
-
-
#if !defined(_MSC_VER)
const size_t GLES2Implementation::kMaxSizeOfSimpleResult;
#endif
@@ -439,12 +438,10 @@ GLES2Implementation::GLES2Implementation(
transfer_buffer_id_(transfer_buffer_id),
pack_alignment_(4),
unpack_alignment_(4),
-#if defined(GLES2_SUPPORT_CLIENT_SIDE_BUFFERS)
bound_array_buffer_id_(0),
bound_element_array_buffer_id_(0),
client_side_array_id_(0),
client_side_element_array_id_(0),
-#endif
error_bits_(0) {
// Allocate space for simple GL results.
result_buffer_ = transfer_buffer;
@@ -471,7 +468,7 @@ GLES2Implementation::GLES2Implementation(
texture_id_handler_.reset(new NonSharedIdHandler());
}
-#if defined(GLES2_SUPPORT_CLIENT_SIDE_BUFFERS)
+#if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
GLint max_vertex_attribs;
GetIntegerv(GL_MAX_VERTEX_ATTRIBS, &max_vertex_attribs);
@@ -486,7 +483,9 @@ GLES2Implementation::GLES2Implementation(
}
GLES2Implementation::~GLES2Implementation() {
+#if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
DeleteBuffers(arraysize(reserved_ids_), &reserved_ids_[0]);
+#endif
}
void GLES2Implementation::WaitForCmd() {
@@ -622,7 +621,7 @@ void GLES2Implementation::DrawElements(
if (count == 0) {
return;
}
-#if defined(GLES2_SUPPORT_CLIENT_SIDE_BUFFERS)
+#if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
bool have_client_side =
client_side_buffer_helper_->HaveEnabledClientSideBuffers();
GLsizei num_elements = 0;
@@ -744,12 +743,12 @@ void GLES2Implementation::BindAttribLocation(
void GLES2Implementation::GetVertexAttribPointerv(
GLuint index, GLenum pname, void** ptr) {
-#if defined(GLES2_SUPPORT_CLIENT_SIDE_BUFFERS)
+#if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
// If it's a client side buffer the client has the data.
if (client_side_buffer_helper_->GetAttribPointer(index, pname, ptr)) {
return;
}
-#endif // defined(GLES2_SUPPORT_CLIENT_SIDE_BUFFERS)
+#endif // defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
typedef gles2::GetVertexAttribPointerv::Result Result;
Result* result = GetResultAs<Result*>();
@@ -831,7 +830,7 @@ void GLES2Implementation::PixelStorei(GLenum pname, GLint param) {
void GLES2Implementation::VertexAttribPointer(
GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride,
const void* ptr) {
-#if defined(GLES2_SUPPORT_CLIENT_SIDE_BUFFERS)
+#if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
// Record the info on the client side.
client_side_buffer_helper_->SetAttribPointer(
bound_array_buffer_id_, index, size, type, normalized, stride, ptr);
@@ -840,10 +839,10 @@ void GLES2Implementation::VertexAttribPointer(
helper_->VertexAttribPointer(index, size, type, normalized, stride,
ToGLuint(ptr));
}
-#else // !defined(GLES2_SUPPORT_CLIENT_SIDE_BUFFERS)
+#else // !defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
helper_->VertexAttribPointer(index, size, type, normalized, stride,
ToGLuint(ptr));
-#endif // !defined(GLES2_SUPPORT_CLIENT_SIDE_BUFFERS)
+#endif // !defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
}
void GLES2Implementation::ShaderSource(
@@ -1359,7 +1358,7 @@ void GLES2Implementation::ReadPixels(
}
}
-#if defined(GLES2_SUPPORT_CLIENT_SIDE_BUFFERS)
+#if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
bool GLES2Implementation::IsBufferReservedId(GLuint id) {
for (size_t ii = 0; ii < arraysize(reserved_ids_); ++ii) {
if (id == reserved_ids_[ii]) {
@@ -1374,14 +1373,13 @@ bool GLES2Implementation::IsBufferReservedId(GLuint) { // NOLINT
}
#endif
-#if defined(GLES2_SUPPORT_CLIENT_SIDE_BUFFERS)
-
void GLES2Implementation::BindBuffer(GLenum target, GLuint buffer) {
if (IsBufferReservedId(buffer)) {
SetGLError(GL_INVALID_OPERATION, "glBindBuffer: reserved buffer id");
return;
}
buffer_id_handler_->MarkAsUsedForBind(buffer);
+#if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
switch (target) {
case GL_ARRAY_BUFFER:
bound_array_buffer_id_ = buffer;
@@ -1392,6 +1390,7 @@ void GLES2Implementation::BindBuffer(GLenum target, GLuint buffer) {
default:
break;
}
+#endif
helper_->BindBuffer(target, buffer);
}
@@ -1401,6 +1400,7 @@ void GLES2Implementation::DeleteBuffers(GLsizei n, const GLuint* buffers) {
return;
}
buffer_id_handler_->FreeIds(n, buffers);
+#if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
for (GLsizei ii = 0; ii < n; ++ii) {
if (buffers[ii] == bound_array_buffer_id_) {
bound_array_buffer_id_ = 0;
@@ -1409,6 +1409,7 @@ void GLES2Implementation::DeleteBuffers(GLsizei n, const GLuint* buffers) {
bound_element_array_buffer_id_ = 0;
}
}
+#endif
// TODO(gman): compute the number of buffers we can delete in 1 call
// based on the size of command buffer and the limit of argument size
// for comments then loop to delete all the buffers. The same needs to
@@ -1417,12 +1418,16 @@ void GLES2Implementation::DeleteBuffers(GLsizei n, const GLuint* buffers) {
}
void GLES2Implementation::DisableVertexAttribArray(GLuint index) {
+#if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
client_side_buffer_helper_->SetAttribEnable(index, false);
+#endif
helper_->DisableVertexAttribArray(index);
}
void GLES2Implementation::EnableVertexAttribArray(GLuint index) {
+#if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
client_side_buffer_helper_->SetAttribEnable(index, true);
+#endif
helper_->EnableVertexAttribArray(index);
}
@@ -1431,19 +1436,24 @@ void GLES2Implementation::DrawArrays(GLenum mode, GLint first, GLsizei count) {
SetGLError(GL_INVALID_VALUE, "glDrawArrays: count < 0");
return;
}
+#if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
bool have_client_side =
client_side_buffer_helper_->HaveEnabledClientSideBuffers();
if (have_client_side) {
client_side_buffer_helper_->SetupSimualtedClientSideBuffers(
this, helper_, first + count);
}
+#endif
helper_->DrawArrays(mode, first, count);
+#if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
if (have_client_side) {
// Restore the user's current binding.
helper_->BindBuffer(GL_ARRAY_BUFFER, bound_array_buffer_id_);
}
+#endif
}
+#if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
bool GLES2Implementation::GetVertexAttribHelper(
GLuint index, GLenum pname, uint32* param) {
const ClientSideBufferHelper::VertexAttribInfo* info =
@@ -1479,14 +1489,17 @@ bool GLES2Implementation::GetVertexAttribHelper(
}
return true;
}
+#endif // GLES2_SUPPORT_CLIENT_SIDE_ARRAYS
void GLES2Implementation::GetVertexAttribfv(
GLuint index, GLenum pname, GLfloat* params) {
+#if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
uint32 value = 0;
if (GetVertexAttribHelper(index, pname, &value)) {
*params = static_cast<float>(value);
return;
}
+#endif
typedef GetVertexAttribfv::Result Result;
Result* result = GetResultAs<Result*>();
result->SetNumResults(0);
@@ -1498,11 +1511,13 @@ void GLES2Implementation::GetVertexAttribfv(
void GLES2Implementation::GetVertexAttribiv(
GLuint index, GLenum pname, GLint* params) {
+#if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
uint32 value = 0;
if (GetVertexAttribHelper(index, pname, &value)) {
*params = value;
return;
}
+#endif
typedef GetVertexAttribiv::Result Result;
Result* result = GetResultAs<Result*>();
result->SetNumResults(0);
@@ -1525,8 +1540,6 @@ GLboolean GLES2Implementation::CommandBufferEnableCHROMIUM(
return *result;
}
-#endif // defined(GLES2_SUPPORT_CLIENT_SIDE_BUFFERS)
-
void* GLES2Implementation::MapBufferSubDataCHROMIUM(
GLuint target, GLintptr offset, GLsizeiptr size, GLenum access) {
// NOTE: target is NOT checked because the service will check it
diff --git a/gpu/command_buffer/client/gles2_implementation.h b/gpu/command_buffer/client/gles2_implementation.h
index f3f202e..1017ef1 100644
--- a/gpu/command_buffer/client/gles2_implementation.h
+++ b/gpu/command_buffer/client/gles2_implementation.h
@@ -18,8 +18,6 @@
#include "../client/gles2_cmd_helper.h"
#include "../client/ring_buffer.h"
-#define GLES2_SUPPORT_CLIENT_SIDE_BUFFERS 1
-
// TODO(gman): replace with logging code expansion.
#define GPU_CLIENT_LOG(args)
@@ -94,67 +92,13 @@ class GLES2Implementation {
// this file instead of having to edit some template or the code generator.
#include "../client/gles2_implementation_autogen.h"
- #if defined(GLES2_SUPPORT_CLIENT_SIDE_BUFFERS)
- void BindBuffer(GLenum target, GLuint buffer);
- void DeleteBuffers(GLsizei n, const GLuint* buffers);
- void DisableVertexAttribArray(GLuint index);
- void DrawArrays(GLenum mode, GLint first, GLsizei count);
- void EnableVertexAttribArray(GLuint index);
- void GetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params);
- void GetVertexAttribiv(GLuint index, GLenum pname, GLint* params);
- #else
- void BindBuffer(GLenum target, GLuint buffer) {
- if (IsReservedId(buffer)) {
- SetGLError(GL_INVALID_OPERATION, "glBindBuffer: reserved buffer id");
- return;
- }
- if (buffer != 0) {
- id_allocator_.MarkAsUsed(buffer);
- }
- helper_->BindBuffer(target, buffer);
- }
-
- void DeleteBuffers(GLsizei n, const GLuint* buffers) {
- FreeIds(n, buffers);
- helper_->DeleteBuffersImmediate(n, buffers);
- }
-
- void DisableVertexAttribArray(GLuint index) {
- helper_->DisableVertexAttribArray(index);
- }
-
- void DrawArrays(GLenum mode, GLint first, GLsizei count) {
- if (count < 0) {
- SetGLError(GL_INVALID_VALUE, "glDrawArrays: count < 0");
- return;
- }
- helper_->DrawArrays(mode, first, count);
- }
-
- void EnableVertexAttribArray(GLuint index) {
- helper_->EnableVertexAttribArray(index);
- }
-
- void GetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params) {
- typedef GetVertexAttribfv::Result Result;
- Result* result = GetResultAs<Result*>();
- result->SetNumResults(0);
- helper_->GetVertexAttribfv(
- index, pname, result_shm_id(), result_shm_offset());
- WaitForCmd();
- result->CopyResult(params);
- }
-
- void GetVertexAttribiv(GLuint index, GLenum pname, GLint* params) {
- typedef GetVertexAttribiv::Result Result;
- Result* result = GetResultAs<Result*>();
- result->SetNumResults(0);
- helper_->GetVertexAttribiv(
- index, pname, result_shm_id(), result_shm_offset());
- WaitForCmd();
- result->CopyResult(params);
- }
- #endif
+ void BindBuffer(GLenum target, GLuint buffer);
+ void DeleteBuffers(GLsizei n, const GLuint* buffers);
+ void DisableVertexAttribArray(GLuint index);
+ void DrawArrays(GLenum mode, GLint first, GLsizei count);
+ void EnableVertexAttribArray(GLuint index);
+ void GetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params);
+ void GetVertexAttribiv(GLuint index, GLenum pname, GLint* params);
GLuint MakeTextureId() {
GLuint id;
@@ -329,14 +273,12 @@ class GLES2Implementation {
bool IsRenderbufferReservedId(GLuint id) { return false; }
bool IsTextureReservedId(GLuint id) { return false; }
-#if defined(GLES2_SUPPORT_CLIENT_SIDE_BUFFERS)
// Helper for GetVertexAttrib
bool GetVertexAttribHelper(GLuint index, GLenum pname, uint32* param);
// Asks the service for the max index in an element array buffer.
GLsizei GetMaxIndexInElementArrayBuffer(
GLuint buffer_id, GLsizei count, GLenum type, GLuint offset);
-#endif
GLES2Util util_;
GLES2CmdHelper* helper_;
@@ -359,7 +301,6 @@ class GLES2Implementation {
// unpack alignment as last set by glPixelStorei
GLint unpack_alignment_;
-#if defined(GLES2_SUPPORT_CLIENT_SIDE_BUFFERS)
// The currently bound array buffer.
GLuint bound_array_buffer_id_;
@@ -375,7 +316,6 @@ class GLES2Implementation {
scoped_ptr<ClientSideBufferHelper> client_side_buffer_helper_;
GLuint reserved_ids_[2];
-#endif
// Current GL error bits.
uint32 error_bits_;
diff --git a/gpu/command_buffer/client/gles2_implementation_unittest.cc b/gpu/command_buffer/client/gles2_implementation_unittest.cc
index dabcba3..aa187e0 100644
--- a/gpu/command_buffer/client/gles2_implementation_unittest.cc
+++ b/gpu/command_buffer/client/gles2_implementation_unittest.cc
@@ -10,6 +10,10 @@
#include "testing/gtest/include/gtest/gtest.h"
#include "testing/gmock/include/gmock/gmock.h"
+#if !defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
+#define GLES2_SUPPORT_CLIENT_SIDE_ARRAYS
+#endif
+
namespace gpu {
class GLES2MockCommandBufferHelper : public CommandBuffer {
@@ -181,7 +185,7 @@ class GLES2ImplementationTest : public testing::Test {
helper_.reset(new GLES2CmdHelper(command_buffer_.get()));
helper_->Initialize(kCommandBufferSizeBytes);
- #if defined(GLES2_SUPPORT_CLIENT_SIDE_BUFFERS)
+ #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
EXPECT_CALL(*command_buffer_, OnFlush(_))
.WillOnce(SetMemory(SizedResultHelper<GLint>(kMaxVertexAttribs)))
.RetiresOnSaturation();
@@ -313,7 +317,7 @@ TEST_F(GLES2ImplementationTest, GetShaderSource) {
EXPECT_EQ(buf[sizeof(kString)], kBad);
}
-#if defined(GLES2_SUPPORT_CLIENT_SIDE_BUFFERS)
+#if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
TEST_F(GLES2ImplementationTest, DrawArraysClientSideBuffers) {
static const float verts[][4] = {
@@ -685,8 +689,6 @@ TEST_F(GLES2ImplementationTest, GetVertexAttrib) {
EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
}
-#endif // defined(GLES2_SUPPORT_CLIENT_SIDE_BUFFERS)
-
TEST_F(GLES2ImplementationTest, ReservedIds) {
// Only the get error command should be issued.
struct Cmds {
@@ -711,6 +713,8 @@ TEST_F(GLES2ImplementationTest, ReservedIds) {
EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
}
+#endif // defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
+
TEST_F(GLES2ImplementationTest, ReadPixels2Reads) {
struct Cmds {
ReadPixels read1;