summaryrefslogtreecommitdiffstats
path: root/gpu/command_buffer/client
diff options
context:
space:
mode:
authorgman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-02-05 23:02:25 +0000
committergman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-02-05 23:02:25 +0000
commit0bfd9882d39c63727676616ef1401d7618fdd26c (patch)
treef81bccc6d5a6f652cb600d5b61fa95b72181a513 /gpu/command_buffer/client
parented0cf569f40ba5e11402c691c6bef6304d3d45c6 (diff)
downloadchromium_src-0bfd9882d39c63727676616ef1401d7618fdd26c.zip
chromium_src-0bfd9882d39c63727676616ef1401d7618fdd26c.tar.gz
chromium_src-0bfd9882d39c63727676616ef1401d7618fdd26c.tar.bz2
Adds
glGetActiveAttrib glGetActiveUniform glGetAttachedShaders glGetShaderPrecision TEST=none BUG=none Review URL: http://codereview.chromium.org/577017 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@38270 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu/command_buffer/client')
-rw-r--r--gpu/command_buffer/client/cmd_buffer_helper.h72
-rw-r--r--gpu/command_buffer/client/gles2_cmd_helper_autogen.h40
-rw-r--r--gpu/command_buffer/client/gles2_implementation.cc160
-rw-r--r--gpu/command_buffer/client/gles2_implementation.h24
4 files changed, 251 insertions, 45 deletions
diff --git a/gpu/command_buffer/client/cmd_buffer_helper.h b/gpu/command_buffer/client/cmd_buffer_helper.h
index 72984d1..c65a23a 100644
--- a/gpu/command_buffer/client/cmd_buffer_helper.h
+++ b/gpu/command_buffer/client/cmd_buffer_helper.h
@@ -117,6 +117,78 @@ class CommandBufferHelper {
cmd.Init(token);
}
+ void Jump(uint32 offset) {
+ cmd::Jump& cmd = GetCmdSpace<cmd::Jump>();
+ cmd.Init(offset);
+ }
+
+ void JumpRelative(int32 offset) {
+ cmd::JumpRelative& cmd = GetCmdSpace<cmd::JumpRelative>();
+ cmd.Init(offset);
+ }
+
+ void Call(uint32 offset) {
+ cmd::Call& cmd = GetCmdSpace<cmd::Call>();
+ cmd.Init(offset);
+ }
+
+ void CallRelative(int32 offset) {
+ cmd::CallRelative& cmd = GetCmdSpace<cmd::CallRelative>();
+ cmd.Init(offset);
+ }
+
+ void Return() {
+ cmd::Return& cmd = GetCmdSpace<cmd::Return>();
+ cmd.Init();
+ }
+
+ void SetBucketSize(uint32 bucket_id, uint32 size) {
+ cmd::SetBucketSize& cmd = GetCmdSpace<cmd::SetBucketSize>();
+ cmd.Init(bucket_id, size);
+ }
+
+ void SetBucketData(uint32 bucket_id,
+ uint32 offset,
+ uint32 size,
+ uint32 shared_memory_id,
+ uint32 shared_memory_offset) {
+ cmd::SetBucketData& cmd = GetCmdSpace<cmd::SetBucketData>();
+ cmd.Init(bucket_id,
+ offset,
+ size,
+ shared_memory_id,
+ shared_memory_offset);
+ }
+
+ void SetBucketDataImmediate(
+ uint32 bucket_id, uint32 offset, const void* data, uint32 size) {
+ cmd::SetBucketDataImmediate& cmd =
+ GetImmediateCmdSpace<cmd::SetBucketDataImmediate>(size);
+ cmd.Init(bucket_id, offset, size);
+ memcpy(ImmediateDataAddress(&cmd), data, size);
+ }
+
+ void GetBucketSize(uint32 bucket_id,
+ uint32 shared_memory_id,
+ uint32 shared_memory_offset) {
+ cmd::GetBucketSize& cmd = GetCmdSpace<cmd::GetBucketSize>();
+ cmd.Init(bucket_id,
+ shared_memory_id,
+ shared_memory_offset);
+ }
+
+ void GetBucketData(uint32 bucket_id,
+ uint32 offset,
+ uint32 size,
+ uint32 shared_memory_id,
+ uint32 shared_memory_offset) {
+ cmd::GetBucketData& cmd = GetCmdSpace<cmd::GetBucketData>();
+ cmd.Init(bucket_id,
+ offset,
+ size,
+ shared_memory_id,
+ shared_memory_offset);
+ }
private:
// Waits until get changes, updating the value of get_.
diff --git a/gpu/command_buffer/client/gles2_cmd_helper_autogen.h b/gpu/command_buffer/client/gles2_cmd_helper_autogen.h
index 66eea9d..5e63eb8 100644
--- a/gpu/command_buffer/client/gles2_cmd_helper_autogen.h
+++ b/gpu/command_buffer/client/gles2_cmd_helper_autogen.h
@@ -425,37 +425,24 @@
}
void GetActiveAttrib(
- GLuint program, GLuint index, GLsizei bufsize, uint32 length_shm_id,
- uint32 length_shm_offset, uint32 size_shm_id, uint32 size_shm_offset,
- uint32 type_shm_id, uint32 type_shm_offset, uint32 name_shm_id,
- uint32 name_shm_offset) {
+ GLuint program, GLuint index, uint32 name_bucket_id, uint32 result_shm_id,
+ uint32 result_shm_offset) {
gles2::GetActiveAttrib& c = GetCmdSpace<gles2::GetActiveAttrib>();
- c.Init(
- program, index, bufsize, length_shm_id, length_shm_offset, size_shm_id,
- size_shm_offset, type_shm_id, type_shm_offset, name_shm_id,
- name_shm_offset);
+ c.Init(program, index, name_bucket_id, result_shm_id, result_shm_offset);
}
void GetActiveUniform(
- GLuint program, GLuint index, GLsizei bufsize, uint32 length_shm_id,
- uint32 length_shm_offset, uint32 size_shm_id, uint32 size_shm_offset,
- uint32 type_shm_id, uint32 type_shm_offset, uint32 name_shm_id,
- uint32 name_shm_offset) {
+ GLuint program, GLuint index, uint32 name_bucket_id, uint32 result_shm_id,
+ uint32 result_shm_offset) {
gles2::GetActiveUniform& c = GetCmdSpace<gles2::GetActiveUniform>();
- c.Init(
- program, index, bufsize, length_shm_id, length_shm_offset, size_shm_id,
- size_shm_offset, type_shm_id, type_shm_offset, name_shm_id,
- name_shm_offset);
+ c.Init(program, index, name_bucket_id, result_shm_id, result_shm_offset);
}
void GetAttachedShaders(
- GLuint program, GLsizei maxcount, uint32 count_shm_id,
- uint32 count_shm_offset, uint32 shaders_shm_id,
- uint32 shaders_shm_offset) {
+ GLuint program, uint32 result_shm_id, uint32 result_shm_offset,
+ uint32 result_size) {
gles2::GetAttachedShaders& c = GetCmdSpace<gles2::GetAttachedShaders>();
- c.Init(
- program, maxcount, count_shm_id, count_shm_offset, shaders_shm_id,
- shaders_shm_offset);
+ c.Init(program, result_shm_id, result_shm_offset, result_size);
}
void GetBooleanv(
@@ -540,14 +527,11 @@
}
void GetShaderPrecisionFormat(
- GLenum shadertype, GLenum precisiontype, uint32 range_shm_id,
- uint32 range_shm_offset, uint32 precision_shm_id,
- uint32 precision_shm_offset) {
+ GLenum shadertype, GLenum precisiontype, uint32 result_shm_id,
+ uint32 result_shm_offset) {
gles2::GetShaderPrecisionFormat& c =
GetCmdSpace<gles2::GetShaderPrecisionFormat>();
- c.Init(
- shadertype, precisiontype, range_shm_id, range_shm_offset,
- precision_shm_id, precision_shm_offset);
+ c.Init(shadertype, precisiontype, result_shm_id, result_shm_offset);
}
void GetShaderSource(
diff --git a/gpu/command_buffer/client/gles2_implementation.cc b/gpu/command_buffer/client/gles2_implementation.cc
index 8ea20ab..edeb1fa 100644
--- a/gpu/command_buffer/client/gles2_implementation.cc
+++ b/gpu/command_buffer/client/gles2_implementation.cc
@@ -54,15 +54,71 @@ void GLES2Implementation::FreeIds(GLsizei n, const GLuint* ids) {
}
}
-void GLES2Implementation::CopyResult(void* dst) {
- SizedResult* result = static_cast<SizedResult*>(result_buffer_);
- memcpy(dst, result->GetDataAs<void*>(), result->size);
-}
-
void GLES2Implementation::WaitForCmd() {
helper_->CommandBufferHelper::Finish();
}
+void GLES2Implementation::GetBucketContents(uint32 bucket_id,
+ std::vector<int8>* data) {
+ DCHECK(data);
+ helper_->GetBucketSize(bucket_id, result_shm_id(), result_shm_offset());
+ WaitForCmd();
+ uint32 size = GetResultAs<cmd::GetBucketSize::Result>();
+ data->resize(size);
+ if (size > 0u) {
+ uint32 max_size = transfer_buffer_.GetLargestFreeOrPendingSize();
+ uint32 offset = 0;
+ while (size) {
+ uint32 part_size = std::min(max_size, size);
+ void* buffer = transfer_buffer_.Alloc(part_size);
+ helper_->GetBucketData(
+ bucket_id, offset, part_size,
+ transfer_buffer_id_, transfer_buffer_.GetOffset(buffer));
+ WaitForCmd();
+ memcpy(&(*data)[offset], buffer, part_size);
+ transfer_buffer_.Free(buffer);
+ offset += part_size;
+ size -= part_size;
+ }
+ // Free the bucket. This is not required but it does free up the memory.
+ // and we don't have to wait for the result so from the client's perspective
+ // it's cheap.
+ helper_->SetBucketSize(bucket_id, 0);
+ }
+}
+
+void GLES2Implementation::SetBucketContents(
+ uint32 bucket_id, const void* data, size_t size) {
+ DCHECK(data);
+ helper_->SetBucketSize(bucket_id, size);
+ if (size > 0u) {
+ uint32 max_size = transfer_buffer_.GetLargestFreeOrPendingSize();
+ uint32 offset = 0;
+ while (size) {
+ uint32 part_size = std::min(static_cast<size_t>(max_size), size);
+ void* buffer = transfer_buffer_.Alloc(part_size);
+ memcpy(buffer, static_cast<const int8*>(data) + offset, part_size);
+ helper_->SetBucketData(
+ bucket_id, offset, part_size,
+ transfer_buffer_id_, transfer_buffer_.GetOffset(buffer));
+ transfer_buffer_.FreePendingToken(buffer, helper_->InsertToken());
+ offset += part_size;
+ size -= part_size;
+ }
+ }
+}
+
+std::string GLES2Implementation::GetBucketAsString(uint32 bucket_id) {
+ std::vector<int8> data;
+ GetBucketContents(bucket_id, &data);
+ return std::string(reinterpret_cast<char*>(&data[0]), data.size());
+}
+
+void GLES2Implementation::SetBucketAsString(
+ uint32 bucket_id, const std::string& str) {
+ SetBucketContents(bucket_id, str.c_str(), str.size());
+}
+
void GLES2Implementation::DrawElements(
GLenum mode, GLsizei count, GLenum type, const void* indices) {
helper_->DrawElements(mode, count, type, ToGLuint(indices));
@@ -79,7 +135,7 @@ void GLES2Implementation::Flush() {
void GLES2Implementation::Finish() {
// Insert the cmd to call glFinish
helper_->Finish();
- // Flinish our command buffer
+ // Finish our command buffer
// (tell the service to execute upto the Finish cmd and wait for it to
// execute.)
helper_->CommandBufferHelper::Finish();
@@ -95,7 +151,8 @@ void GLES2Implementation::GetVertexAttribPointerv(
helper_->GetVertexAttribPointerv(
index, pname, result_shm_id(), result_shm_offset());
WaitForCmd();
- CopyResult(ptr);
+ static_cast<gles2::GetVertexAttribPointerv::Result*>(
+ result_buffer_)->CopyResult(ptr);
};
GLint GLES2Implementation::GetAttribLocation(
@@ -299,18 +356,82 @@ GLenum GLES2Implementation::CheckFramebufferStatus(GLenum target) {
void GLES2Implementation::GetActiveAttrib(
GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size,
GLenum* type, char* name) {
- // TODO(gman): implement.
+ typedef gles2::GetActiveAttrib::Result Result;
+ Result* result = static_cast<Result*>(result_buffer_);
+ helper_->GetActiveAttrib(program, index, kResultBucketId,
+ result_shm_id(), result_shm_offset());
+ WaitForCmd();
+ if (result->success) {
+ if (size) {
+ *size = result->size;
+ }
+ if (type) {
+ *type = result->type;
+ }
+ if (length || name) {
+ std::vector<int8> str;
+ GetBucketContents(kResultBucketId, &str);
+ GLsizei max_size = std::min(static_cast<size_t>(bufsize) - 1,
+ str.size());
+ if (length) {
+ *length = max_size;
+ }
+ if (name && bufsize > 0) {
+ memcpy(name, &str[0], max_size);
+ name[max_size] = '\0';
+ }
+ }
+ }
}
void GLES2Implementation::GetActiveUniform(
GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size,
GLenum* type, char* name) {
- // TODO(gman): implement.
+ typedef gles2::GetActiveUniform::Result Result;
+ Result* result = static_cast<Result*>(result_buffer_);
+ helper_->GetActiveUniform(program, index, kResultBucketId,
+ result_shm_id(), result_shm_offset());
+ WaitForCmd();
+ if (result->success) {
+ if (size) {
+ *size = result->size;
+ }
+ if (type) {
+ *type = result->type;
+ }
+ if (length || name) {
+ std::vector<int8> str;
+ GetBucketContents(kResultBucketId, &str);
+ GLsizei max_size = std::min(static_cast<size_t>(bufsize) - 1,
+ str.size());
+ if (length) {
+ *length = max_size;
+ }
+ if (name && bufsize > 0) {
+ memcpy(name, &str[0], max_size);
+ name[max_size] = '\0';
+ }
+ }
+ }
}
void GLES2Implementation::GetAttachedShaders(
GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders) {
- // TODO(gman): implement.
+ typedef gles2::GetAttachedShaders::Result Result;
+ uint32 size = Result::ComputeSize(maxcount);
+ Result* result = transfer_buffer_.AllocTyped<Result>(size);
+ helper_->GetAttachedShaders(
+ program,
+ transfer_buffer_id_,
+ transfer_buffer_.GetOffset(result),
+ size);
+ int32 token = helper_->InsertToken();
+ WaitForCmd();
+ if (count) {
+ *count = result->GetNumResults();
+ }
+ result->CopyResult(shaders);
+ transfer_buffer_.FreePendingToken(result, token);
}
void GLES2Implementation::GetProgramInfoLog(
@@ -325,7 +446,20 @@ void GLES2Implementation::GetShaderInfoLog(
void GLES2Implementation::GetShaderPrecisionFormat(
GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision) {
- // TODO(gman): implement.
+ typedef gles2::GetShaderPrecisionFormat::Result Result;
+ Result* result = static_cast<Result*>(result_buffer_);
+ helper_->GetShaderPrecisionFormat(
+ shadertype, precisiontype, result_shm_id(), result_shm_offset());
+ WaitForCmd();
+ if (result->success) {
+ if (range) {
+ range[0] = result->min_range;
+ range[1] = result->max_range;
+ }
+ if (precision) {
+ precision[0] = result->precision;
+ }
+ }
}
void GLES2Implementation::GetShaderSource(
@@ -343,7 +477,7 @@ void GLES2Implementation::GetUniformfv(
helper_->GetUniformfv(
program, location, result_shm_id(), result_shm_offset());
WaitForCmd();
- CopyResult(params);
+ static_cast<gles2::GetUniformfv::Result*>(result_buffer_)->CopyResult(params);
}
void GLES2Implementation::GetUniformiv(
@@ -351,7 +485,7 @@ void GLES2Implementation::GetUniformiv(
helper_->GetUniformiv(
program, location, result_shm_id(), result_shm_offset());
WaitForCmd();
- CopyResult(params);
+ static_cast<gles2::GetUniformfv::Result*>(result_buffer_)->CopyResult(params);
}
void GLES2Implementation::ReadPixels(
diff --git a/gpu/command_buffer/client/gles2_implementation.h b/gpu/command_buffer/client/gles2_implementation.h
index ac519f9..579e0d3 100644
--- a/gpu/command_buffer/client/gles2_implementation.h
+++ b/gpu/command_buffer/client/gles2_implementation.h
@@ -5,6 +5,8 @@
#ifndef GPU_COMMAND_BUFFER_CLIENT_GLES2_IMPLEMENTATION_H_
#define GPU_COMMAND_BUFFER_CLIENT_GLES2_IMPLEMENTATION_H_
+#include <string>
+#include <vector>
#include "gpu/command_buffer/common/gles2_cmd_utils.h"
#include "gpu/command_buffer/client/gles2_cmd_helper.h"
#include "gpu/command_buffer/client/id_allocator.h"
@@ -63,14 +65,28 @@ class GLES2Implementation {
return *static_cast<T*>(result_buffer_);
}
- // Copies the result.
- void CopyResult(void* dst);
-
// Waits for all commands to execute.
void WaitForCmd();
+ // TODO(gman): These bucket functions really seem like they belong in
+ // CommandBufferHelper (or maybe BucketHelper?). Unfortunately they need
+ // a transfer buffer to function which is currently managed by this class.
+
+ // Gets the contents of a bucket.
+ void GetBucketContents(uint32 bucket_id, std::vector<int8>* data);
+
+ // Sets the contents of a bucket.
+ void SetBucketContents(uint32 bucket_id, const void* data, size_t size);
+
+ // Gets the contents of a bucket as a string.
+ std::string GetBucketAsString(uint32 bucket_id);
+
+ // Sets the contents of a bucket as a string.
+ void SetBucketAsString(uint32 bucket_id, const std::string& str);
+
// The maxiumum result size from simple GL get commands.
- static const size_t kMaxSizeOfSimpleResult = 4 * sizeof(uint32); // NOLINT.
+ static const size_t kMaxSizeOfSimpleResult = 16 * sizeof(uint32); // NOLINT.
+ static const uint32 kResultBucketId = 1;
GLES2Util util_;
GLES2CmdHelper* helper_;