Index: gpu/command_buffer/client/gles2_implementation.cc |
diff --git a/gpu/command_buffer/client/gles2_implementation.cc b/gpu/command_buffer/client/gles2_implementation.cc |
index a0f3dd3eb2ab1b308f63d1b24ba1955e105d14e5..d3fcf87e982d53a515fd1f0e40538060f186fa06 100644 |
--- a/gpu/command_buffer/client/gles2_implementation.cc |
+++ b/gpu/command_buffer/client/gles2_implementation.cc |
@@ -9,6 +9,7 @@ |
#include <GLES2/gl2ext.h> |
#include <GLES2/gles2_command_buffer.h> |
#include "../client/mapped_memory.h" |
+#include "../client/program_info_manager.h" |
#include "../common/gles2_cmd_utils.h" |
#include "../common/id_allocator.h" |
#include "../common/trace_event.h" |
@@ -514,6 +515,9 @@ GLES2Implementation::GLES2Implementation( |
texture_units_.reset( |
new TextureUnit[gl_state_.max_combined_texture_image_units]); |
+ |
+ program_info_manager_.reset(ProgramInfoManager::Create(sharing_resources_)); |
+ |
#if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) |
buffer_id_handler_->MakeIds( |
kClientSideArrayId, arraysize(reserved_ids_), &reserved_ids_[0]); |
@@ -949,28 +953,37 @@ void GLES2Implementation::GetVertexAttribPointerv( |
}); |
} |
-GLint GLES2Implementation::GetAttribLocation( |
+void GLES2Implementation::DeleteProgramOrShaderHelper( |
+ GLuint program_or_shader) { |
+ program_and_shader_id_handler_->FreeIds(1, &program_or_shader); |
+ program_info_manager_->DeleteInfo(program_or_shader); |
+} |
+ |
+GLint GLES2Implementation::GetAttribLocationHelper( |
GLuint program, const char* name) { |
- GPU_CLIENT_LOG("[" << this << "] glGetAttribLocation(" << program |
- << ", " << name << ")"); |
- TRACE_EVENT0("gpu", "GLES2::GetAttribLocation"); |
typedef GetAttribLocationBucket::Result Result; |
Result* result = GetResultAs<Result*>(); |
*result = -1; |
SetBucketAsCString(kResultBucketId, name); |
- helper_->GetAttribLocationBucket(program, kResultBucketId, |
- result_shm_id(), result_shm_offset()); |
+ helper_->GetAttribLocationBucket( |
+ program, kResultBucketId, result_shm_id(), result_shm_offset()); |
WaitForCmd(); |
helper_->SetBucketSize(kResultBucketId, 0); |
- GPU_CLIENT_LOG("returned " << *result); |
return *result; |
} |
-GLint GLES2Implementation::GetUniformLocation( |
+GLint GLES2Implementation::GetAttribLocation( |
GLuint program, const char* name) { |
- GPU_CLIENT_LOG("[" << this << "] glGetUniformLocation(" << program |
+ GPU_CLIENT_LOG("[" << this << "] glGetAttribLocation(" << program |
<< ", " << name << ")"); |
- TRACE_EVENT0("gpu", "GLES2::GetUniformLocation"); |
+ TRACE_EVENT0("gpu", "GLES2::GetAttribLocation"); |
+ GLint loc = program_info_manager_->GetAttribLocation(this, program, name); |
+ GPU_CLIENT_LOG("returned " << loc); |
+ return loc; |
+} |
+ |
+GLint GLES2Implementation::GetUniformLocationHelper( |
+ GLuint program, const char* name) { |
typedef GetUniformLocationBucket::Result Result; |
Result* result = GetResultAs<Result*>(); |
*result = -1; |
@@ -979,10 +992,29 @@ GLint GLES2Implementation::GetUniformLocation( |
result_shm_id(), result_shm_offset()); |
WaitForCmd(); |
helper_->SetBucketSize(kResultBucketId, 0); |
- GPU_CLIENT_LOG("returned " << *result); |
return *result; |
} |
+GLint GLES2Implementation::GetUniformLocation( |
+ GLuint program, const char* name) { |
+ GPU_CLIENT_LOG("[" << this << "] glGetUniformLocation(" << program |
+ << ", " << name << ")"); |
+ TRACE_EVENT0("gpu", "GLES2::GetUniformLocation"); |
+ GLint loc = program_info_manager_->GetUniformLocation(this, program, name); |
+ GPU_CLIENT_LOG("returned " << loc); |
+ return loc; |
+} |
+ |
+bool GLES2Implementation::GetProgramivHelper( |
+ GLuint program, GLenum pname, GLint* params) { |
+ return program_info_manager_->GetProgramiv(this, program, pname, params); |
+} |
+ |
+void GLES2Implementation::LinkProgram(GLuint program) { |
+ GPU_CLIENT_LOG("[" << this << "] glLinkProgram(" << program << ")"); |
+ helper_->LinkProgram(program); |
+ program_info_manager_->CreateInfo(program); |
+} |
void GLES2Implementation::ShaderBinary( |
GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, |
@@ -1436,21 +1468,10 @@ void GLES2Implementation::TexSubImage2DImpl( |
} |
} |
-void GLES2Implementation::GetActiveAttrib( |
+bool GLES2Implementation::GetActiveAttribHelper( |
GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, |
GLenum* type, char* name) { |
- GPU_CLIENT_LOG("[" << this << "] glGetActiveAttrib(" |
- << program << ", " << index << ", " << bufsize << ", " |
- << static_cast<const void*>(length) << ", " |
- << static_cast<const void*>(size) << ", " |
- << static_cast<const void*>(type) << ", " |
- << static_cast<const void*>(name) << ", "); |
- if (bufsize < 0) { |
- SetGLError(GL_INVALID_VALUE, "glGetActiveAttrib: bufsize < 0"); |
- return; |
- } |
- TRACE_EVENT0("gpu", "GLES2::GetActiveAttrib"); |
- // Clear the bucket so if we the command fails nothing will be in it. |
+ // Clear the bucket so if the command fails nothing will be in it. |
helper_->SetBucketSize(kResultBucketId, 0); |
typedef gles2::GetActiveAttrib::Result Result; |
Result* result = static_cast<Result*>(result_buffer_); |
@@ -1462,11 +1483,9 @@ void GLES2Implementation::GetActiveAttrib( |
if (result->success) { |
if (size) { |
*size = result->size; |
- GPU_CLIENT_LOG(" size: " << *size); |
} |
if (type) { |
*type = result->type; |
- GPU_CLIENT_LOG(" type: " << GLES2Util::GetStringEnum(*type)); |
} |
if (length || name) { |
std::vector<int8> str; |
@@ -1480,27 +1499,45 @@ void GLES2Implementation::GetActiveAttrib( |
if (name && bufsize > 0) { |
memcpy(name, &str[0], max_size); |
name[max_size] = '\0'; |
- GPU_CLIENT_LOG(" name: " << name); |
} |
} |
} |
+ return result->success != 0; |
} |
-void GLES2Implementation::GetActiveUniform( |
+void GLES2Implementation::GetActiveAttrib( |
GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, |
GLenum* type, char* name) { |
- GPU_CLIENT_LOG("[" << this << "] glGetActiveUniform(" |
+ GPU_CLIENT_LOG("[" << this << "] glGetActiveAttrib(" |
<< program << ", " << index << ", " << bufsize << ", " |
<< static_cast<const void*>(length) << ", " |
<< static_cast<const void*>(size) << ", " |
<< static_cast<const void*>(type) << ", " |
<< static_cast<const void*>(name) << ", "); |
if (bufsize < 0) { |
- SetGLError(GL_INVALID_VALUE, "glGetActiveUniform: bufsize < 0"); |
+ SetGLError(GL_INVALID_VALUE, "glGetActiveAttrib: bufsize < 0"); |
return; |
} |
- TRACE_EVENT0("gpu", "GLES2::GetActiveUniform"); |
- // Clear the bucket so if we the command fails nothing will be in it. |
+ TRACE_EVENT0("gpu", "GLES2::GetActiveAttrib"); |
+ bool success = program_info_manager_->GetActiveAttrib( |
+ this, program, index, bufsize, length, size, type, name); |
+ if (success) { |
+ if (size) { |
+ GPU_CLIENT_LOG(" size: " << *size); |
+ } |
+ if (type) { |
+ GPU_CLIENT_LOG(" type: " << GLES2Util::GetStringEnum(*type)); |
+ } |
+ if (name) { |
+ GPU_CLIENT_LOG(" name: " << name); |
+ } |
+ } |
+} |
+ |
+bool GLES2Implementation::GetActiveUniformHelper( |
+ GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, |
+ GLenum* type, char* name) { |
+ // Clear the bucket so if the command fails nothing will be in it. |
helper_->SetBucketSize(kResultBucketId, 0); |
typedef gles2::GetActiveUniform::Result Result; |
Result* result = static_cast<Result*>(result_buffer_); |
@@ -1512,11 +1549,9 @@ void GLES2Implementation::GetActiveUniform( |
if (result->success) { |
if (size) { |
*size = result->size; |
- GPU_CLIENT_LOG(" size: " << *size); |
} |
if (type) { |
*type = result->type; |
- GPU_CLIENT_LOG(" type: " << GLES2Util::GetStringEnum(*type)); |
} |
if (length || name) { |
std::vector<int8> str; |
@@ -1530,10 +1565,39 @@ void GLES2Implementation::GetActiveUniform( |
if (name && bufsize > 0) { |
memcpy(name, &str[0], max_size); |
name[max_size] = '\0'; |
- GPU_CLIENT_LOG(" name: " << name); |
} |
} |
} |
+ return result->success != 0; |
+} |
+ |
+void GLES2Implementation::GetActiveUniform( |
+ GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, |
+ GLenum* type, char* name) { |
+ GPU_CLIENT_LOG("[" << this << "] glGetActiveUniform(" |
+ << program << ", " << index << ", " << bufsize << ", " |
+ << static_cast<const void*>(length) << ", " |
+ << static_cast<const void*>(size) << ", " |
+ << static_cast<const void*>(type) << ", " |
+ << static_cast<const void*>(name) << ", "); |
+ if (bufsize < 0) { |
+ SetGLError(GL_INVALID_VALUE, "glGetActiveUniform: bufsize < 0"); |
+ return; |
+ } |
+ TRACE_EVENT0("gpu", "GLES2::GetActiveUniform"); |
+ bool success = program_info_manager_->GetActiveUniform( |
+ this, program, index, bufsize, length, size, type, name); |
+ if (success) { |
+ if (size) { |
+ GPU_CLIENT_LOG(" size: " << *size); |
+ } |
+ if (type) { |
+ GPU_CLIENT_LOG(" type: " << GLES2Util::GetStringEnum(*type)); |
+ } |
+ if (name) { |
+ GPU_CLIENT_LOG(" name: " << name); |
+ } |
+ } |
} |
void GLES2Implementation::GetAttachedShaders( |
@@ -2332,6 +2396,15 @@ void GLES2Implementation::GetMultipleIntegervCHROMIUM( |
}); |
} |
+void GLES2Implementation::GetProgramInfoCHROMIUMHelper( |
+ GLuint program, std::vector<int8>* result) { |
+ GPU_DCHECK(result); |
+ // Clear the bucket so if the command fails nothing will be in it. |
+ helper_->SetBucketSize(kResultBucketId, 0); |
+ helper_->GetProgramInfoCHROMIUM(program, kResultBucketId); |
+ GetBucketContents(kResultBucketId, result); |
+} |
+ |
void GLES2Implementation::GetProgramInfoCHROMIUM( |
GLuint program, GLsizei bufsize, GLsizei* size, void* info) { |
if (bufsize < 0) { |
@@ -2345,12 +2418,9 @@ void GLES2Implementation::GetProgramInfoCHROMIUM( |
// Make sure they've set size to 0 else the value will be undefined on |
// lost context. |
GPU_DCHECK(*size == 0); |
- // Clear the bucket so if the command fails nothing will be in it. |
- helper_->SetBucketSize(kResultBucketId, 0); |
- helper_->GetProgramInfoCHROMIUM(program, kResultBucketId); |
std::vector<int8> result; |
- GetBucketContents(kResultBucketId, &result); |
- if (result.size() == 0) { |
+ GetProgramInfoCHROMIUMHelper(program, &result); |
+ if (result.empty()) { |
return; |
} |
*size = result.size(); |