summaryrefslogtreecommitdiffstats
path: root/gpu/command_buffer/service/gles2_cmd_decoder.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gpu/command_buffer/service/gles2_cmd_decoder.cc')
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder.cc245
1 files changed, 179 insertions, 66 deletions
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index 988bc18..93f28f9 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -506,6 +506,25 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>,
return (info && !info->IsDeleted()) ? info : NULL;
}
+ // Gets the program info for the given program. If it's not a program
+ // generates a GL error. Returns NULL if not program.
+ ProgramManager::ProgramInfo* GetProgramInfoNotShader(
+ GLuint client_id, const char* function_name) {
+ ProgramManager::ProgramInfo* info = GetProgramInfo(client_id);
+ if (!info) {
+ if (GetShaderInfo(client_id)) {
+ SetGLError(GL_INVALID_OPERATION,
+ (std::string(function_name) +
+ ": shader passed for program").c_str());
+ } else {
+ SetGLError(GL_INVALID_VALUE,
+ (std::string(function_name) + ": unknown program").c_str());
+ }
+ }
+ return info;
+ }
+
+
// Deletes the program info for the given program.
void RemoveProgramInfo(GLuint client_id) {
program_manager()->RemoveProgramInfo(client_id);
@@ -525,6 +544,25 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>,
return (info && !info->IsDeleted()) ? info : NULL;
}
+ // Gets the shader info for the given shader. If it's not a shader generates a
+ // GL error. Returns NULL if not shader.
+ ShaderManager::ShaderInfo* GetShaderInfoNotProgram(
+ GLuint client_id, const char* function_name) {
+ ShaderManager::ShaderInfo* info = GetShaderInfo(client_id);
+ if (!info) {
+ if (GetProgramInfo(client_id)) {
+ SetGLError(
+ GL_INVALID_OPERATION,
+ (std::string(function_name) +
+ ": program passed for shader").c_str());
+ } else {
+ SetGLError(GL_INVALID_VALUE,
+ (std::string(function_name) + ": unknown shader").c_str());
+ }
+ }
+ return info;
+ }
+
// Deletes the shader info for the given shader.
void RemoveShaderInfo(GLuint client_id) {
shader_manager()->RemoveShaderInfo(client_id);
@@ -1949,6 +1987,87 @@ bool GLES2DecoderImpl::GetHelper(
*num_written = 1;
*params = GL_TRUE;
return true;
+ case GL_ARRAY_BUFFER_BINDING:
+ *num_written = 1;
+ if (bound_array_buffer_) {
+ GLuint client_id = 0;
+ buffer_manager()->GetClientId(bound_array_buffer_->service_id(),
+ &client_id);
+ *params = client_id;
+ } else {
+ *params = 0;
+ }
+ return true;
+ case GL_ELEMENT_ARRAY_BUFFER_BINDING:
+ *num_written = 1;
+ if (bound_element_array_buffer_) {
+ GLuint client_id = 0;
+ buffer_manager()->GetClientId(bound_element_array_buffer_->service_id(),
+ &client_id);
+ *params = client_id;
+ } else {
+ *params = 0;
+ }
+ return true;
+ case GL_FRAMEBUFFER_BINDING:
+ *num_written = 1;
+ if (bound_framebuffer_) {
+ GLuint client_id = 0;
+ framebuffer_manager()->GetClientId(
+ bound_framebuffer_->service_id(), &client_id);
+ *params = client_id;
+ } else {
+ *params = 0;
+ }
+ return true;
+ case GL_RENDERBUFFER_BINDING:
+ *num_written = 1;
+ if (bound_renderbuffer_) {
+ GLuint client_id = 0;
+ renderbuffer_manager()->GetClientId(
+ bound_renderbuffer_->service_id(), &client_id);
+ *params = client_id;
+ } else {
+ *params = 0;
+ }
+ return true;
+ case GL_CURRENT_PROGRAM:
+ *num_written = 1;
+ if (current_program_) {
+ GLuint client_id = 0;
+ program_manager()->GetClientId(
+ current_program_->service_id(), &client_id);
+ *params = client_id;
+ } else {
+ *params = 0;
+ }
+ return true;
+ case GL_TEXTURE_BINDING_2D: {
+ *num_written = 1;
+ TextureUnit& unit = texture_units_[active_texture_unit_];
+ if (unit.bound_texture_2d) {
+ GLuint client_id = 0;
+ texture_manager()->GetClientId(
+ unit.bound_texture_2d->service_id(), &client_id);
+ *params = client_id;
+ } else {
+ *params = 0;
+ }
+ return true;
+ }
+ case GL_TEXTURE_BINDING_CUBE_MAP: {
+ *num_written = 1;
+ TextureUnit& unit = texture_units_[active_texture_unit_];
+ if (unit.bound_texture_cube_map) {
+ GLuint client_id = 0;
+ texture_manager()->GetClientId(
+ unit.bound_texture_cube_map->service_id(), &client_id);
+ *params = client_id;
+ } else {
+ *params = 0;
+ }
+ return true;
+ }
default:
return false;
}
@@ -1992,9 +2111,9 @@ void GLES2DecoderImpl::DoGetIntegerv(GLenum pname, GLint* params) {
void GLES2DecoderImpl::DoGetProgramiv(
GLuint program_id, GLenum pname, GLint* params) {
- ProgramManager::ProgramInfo* info = GetProgramInfo(program_id);
+ ProgramManager::ProgramInfo* info = GetProgramInfoNotShader(
+ program_id, "glGetProgramiv");
if (!info) {
- SetGLError(GL_INVALID_VALUE, "glGetProgramiv: unknown program");
return;
}
info->GetProgramiv(pname, params);
@@ -2002,9 +2121,10 @@ void GLES2DecoderImpl::DoGetProgramiv(
error::Error GLES2DecoderImpl::HandleBindAttribLocation(
uint32 immediate_data_size, const gles2::BindAttribLocation& c) {
- ProgramManager::ProgramInfo* info = GetProgramInfo(c.program);
+ GLuint program = static_cast<GLuint>(c.program);
+ ProgramManager::ProgramInfo* info = GetProgramInfoNotShader(
+ program, "glBindAttribLocation");
if (!info) {
- SetGLError(GL_INVALID_VALUE, "glBindAttribLocation: unknown program");
return error::kNoError;
}
GLuint index = static_cast<GLuint>(c.index);
@@ -2021,9 +2141,10 @@ error::Error GLES2DecoderImpl::HandleBindAttribLocation(
error::Error GLES2DecoderImpl::HandleBindAttribLocationImmediate(
uint32 immediate_data_size, const gles2::BindAttribLocationImmediate& c) {
- ProgramManager::ProgramInfo* info = GetProgramInfo(c.program);
+ GLuint program = static_cast<GLuint>(c.program);
+ ProgramManager::ProgramInfo* info = GetProgramInfoNotShader(
+ program, "glBindAttribLocation");
if (!info) {
- SetGLError(GL_INVALID_VALUE, "glBindAttribLocation: unknown program");
return error::kNoError;
}
GLuint index = static_cast<GLuint>(c.index);
@@ -2040,9 +2161,10 @@ error::Error GLES2DecoderImpl::HandleBindAttribLocationImmediate(
error::Error GLES2DecoderImpl::HandleBindAttribLocationBucket(
uint32 immediate_data_size, const gles2::BindAttribLocationBucket& c) {
- ProgramManager::ProgramInfo* info = GetProgramInfo(c.program);
+ GLuint program = static_cast<GLuint>(c.program);
+ ProgramManager::ProgramInfo* info = GetProgramInfoNotShader(
+ program, "glBindAttribLocation");
if (!info) {
- SetGLError(GL_INVALID_VALUE, "glBindAttribLocation: unknown program");
return error::kNoError;
}
GLuint index = static_cast<GLuint>(c.index);
@@ -2283,19 +2405,18 @@ void GLES2DecoderImpl::DoRenderbufferStorage(
}
void GLES2DecoderImpl::DoLinkProgram(GLuint program) {
- ProgramManager::ProgramInfo* info = GetProgramInfo(program);
+ ProgramManager::ProgramInfo* info = GetProgramInfoNotShader(
+ program, "glLinkProgram");
if (!info) {
- SetGLError(GL_INVALID_OPERATION, "glLinkProgram: unknown program");
return;
}
- CopyRealGLErrorsToWrapper();
glLinkProgram(info->service_id());
- GLenum error = glGetError();
- if (error != GL_NO_ERROR) {
- info->Reset();
- SetGLError(error, NULL);
- } else {
+ GLint success = 0;
+ glGetProgramiv(info->service_id(), GL_LINK_STATUS, &success);
+ if (success) {
info->Update();
+ } else {
+ info->Reset();
}
};
@@ -2368,9 +2489,8 @@ void GLES2DecoderImpl::DoUseProgram(GLuint program) {
GLuint service_id = 0;
ProgramManager::ProgramInfo* info = NULL;
if (program) {
- info = GetProgramInfo(program);
+ info = GetProgramInfoNotShader(program, "glUseProgram");
if (!info) {
- SetGLError(GL_INVALID_VALUE, "glUseProgram: unknown program");
return;
}
if (!info->IsValid()) {
@@ -2618,9 +2738,9 @@ GLuint GLES2DecoderImpl::DoGetMaxValueInBuffer(
// memory.)
error::Error GLES2DecoderImpl::ShaderSourceHelper(
GLuint client_id, const char* data, uint32 data_size) {
- ShaderManager::ShaderInfo* info = GetShaderInfo(client_id);
+ ShaderManager::ShaderInfo* info = GetShaderInfoNotProgram(
+ client_id, "glShaderSource");
if (!info) {
- SetGLError(GL_INVALID_VALUE, "glShaderSource: unknown shader");
return error::kNoError;
}
// Note: We don't actually call glShaderSource here. We wait until
@@ -2663,9 +2783,9 @@ error::Error GLES2DecoderImpl::HandleShaderSourceBucket(
}
void GLES2DecoderImpl::DoCompileShader(GLuint client_id) {
- ShaderManager::ShaderInfo* info = GetShaderInfo(client_id);
+ ShaderManager::ShaderInfo* info = GetShaderInfoNotProgram(
+ client_id, "glCompileShader");
if (!info) {
- SetGLError(GL_INVALID_VALUE, "glCompileShader: unknown shader");
return;
}
// Translate GL ES 2.0 shader to Desktop GL shader and pass that to
@@ -2711,9 +2831,9 @@ void GLES2DecoderImpl::DoCompileShader(GLuint client_id) {
void GLES2DecoderImpl::DoGetShaderiv(
GLuint shader, GLenum pname, GLint* params) {
- ShaderManager::ShaderInfo* info = GetShaderInfo(shader);
+ ShaderManager::ShaderInfo* info = GetShaderInfoNotProgram(
+ shader, "glGetShaderiv");
if (!info) {
- SetGLError(GL_INVALID_VALUE, "glGetShaderiv: unknown shader");
return;
}
if (pname == GL_SHADER_SOURCE_LENGTH) {
@@ -2726,12 +2846,12 @@ void GLES2DecoderImpl::DoGetShaderiv(
error::Error GLES2DecoderImpl::HandleGetShaderSource(
uint32 immediate_data_size, const gles2::GetShaderSource& c) {
GLuint shader = c.shader;
- ShaderManager::ShaderInfo* info = GetShaderInfo(shader);
uint32 bucket_id = static_cast<uint32>(c.bucket_id);
Bucket* bucket = CreateBucket(bucket_id);
+ ShaderManager::ShaderInfo* info = GetShaderInfoNotProgram(
+ shader, "glGetShaderSource");
if (!info) {
bucket->SetSize(0);
- SetGLError(GL_INVALID_VALUE, "glGetShaderSource: unknown shader");
return error::kNoError;
}
bucket->SetFromString(info->source());
@@ -2741,15 +2861,15 @@ error::Error GLES2DecoderImpl::HandleGetShaderSource(
error::Error GLES2DecoderImpl::HandleGetProgramInfoLog(
uint32 immediate_data_size, const gles2::GetProgramInfoLog& c) {
GLuint program = c.program;
- ProgramManager::ProgramInfo* info = GetProgramInfo(program);
+ uint32 bucket_id = static_cast<uint32>(c.bucket_id);
+ Bucket* bucket = CreateBucket(bucket_id);
+ ProgramManager::ProgramInfo* info = GetProgramInfoNotShader(
+ program, "glGetProgramInfoLog");
if (!info) {
- SetGLError(GL_INVALID_VALUE, "glGetProgramInfoLog: unknown program");
return error::kNoError;
}
- uint32 bucket_id = static_cast<uint32>(c.bucket_id);
GLint len = 0;
glGetProgramiv(info->service_id(), GL_INFO_LOG_LENGTH, &len);
- Bucket* bucket = CreateBucket(bucket_id);
bucket->SetSize(len + 1);
glGetProgramInfoLog(
info->service_id(),
@@ -2760,15 +2880,16 @@ error::Error GLES2DecoderImpl::HandleGetProgramInfoLog(
error::Error GLES2DecoderImpl::HandleGetShaderInfoLog(
uint32 immediate_data_size, const gles2::GetShaderInfoLog& c) {
GLuint shader = c.shader;
- ShaderManager::ShaderInfo* info = GetShaderInfo(shader);
+ uint32 bucket_id = static_cast<uint32>(c.bucket_id);
+ Bucket* bucket = CreateBucket(bucket_id);
+ ShaderManager::ShaderInfo* info = GetShaderInfoNotProgram(
+ shader, "glGetShaderInfoLog");
if (!info) {
- SetGLError(GL_INVALID_VALUE, "glGetShaderInfoLog: unknown shader");
+ bucket->SetSize(0);
return error::kNoError;
}
- uint32 bucket_id = static_cast<uint32>(c.bucket_id);
GLint len = 0;
glGetShaderiv(info->service_id(), GL_INFO_LOG_LENGTH, &len);
- Bucket* bucket = CreateBucket(bucket_id);
bucket->SetSize(len + 1);
glGetShaderInfoLog(
info->service_id(),
@@ -2802,14 +2923,14 @@ bool GLES2DecoderImpl::DoIsTexture(GLuint client_id) {
void GLES2DecoderImpl::DoAttachShader(
GLuint program_client_id, GLint shader_client_id) {
- ProgramManager::ProgramInfo* program_info = GetProgramInfo(program_client_id);
+ ProgramManager::ProgramInfo* program_info = GetProgramInfoNotShader(
+ program_client_id, "glAttachShader");
if (!program_info) {
- SetGLError(GL_INVALID_VALUE, "glAttachShader: unknown program");
return;
}
- ShaderManager::ShaderInfo* shader_info = GetShaderInfo(shader_client_id);
+ ShaderManager::ShaderInfo* shader_info = GetShaderInfoNotProgram(
+ shader_client_id, "glAttachShader");
if (!shader_info) {
- SetGLError(GL_INVALID_VALUE, "glAttachShader: unknown shader");
return;
}
glAttachShader(program_info->service_id(), shader_info->service_id());
@@ -2817,23 +2938,23 @@ void GLES2DecoderImpl::DoAttachShader(
void GLES2DecoderImpl::DoDetachShader(
GLuint program_client_id, GLint shader_client_id) {
- ProgramManager::ProgramInfo* program_info = GetProgramInfo(program_client_id);
+ ProgramManager::ProgramInfo* program_info = GetProgramInfoNotShader(
+ program_client_id, "glDetachShader");
if (!program_info) {
- SetGLError(GL_INVALID_VALUE, "glDetachShader: unknown program");
return;
}
- ShaderManager::ShaderInfo* shader_info = GetShaderInfo(shader_client_id);
+ ShaderManager::ShaderInfo* shader_info = GetShaderInfoNotProgram(
+ shader_client_id, "glDetachShader");
if (!shader_info) {
- SetGLError(GL_INVALID_VALUE, "glDetachShader: unknown shader");
return;
}
glDetachShader(program_info->service_id(), shader_info->service_id());
}
void GLES2DecoderImpl::DoValidateProgram(GLuint program_client_id) {
- ProgramManager::ProgramInfo* info = GetProgramInfo(program_client_id);
+ ProgramManager::ProgramInfo* info = GetProgramInfoNotShader(
+ program_client_id, "glValidateProgram");
if (!info) {
- SetGLError(GL_INVALID_VALUE, "glValidateProgram: unknown program");
return;
}
glValidateProgram(info->service_id());
@@ -2951,6 +3072,7 @@ error::Error GLES2DecoderImpl::HandleReadPixels(
return error::kNoError;
}
+ glFinish();
if (x < 0 || y < 0 || max_x > max_size.width() || max_y > max_size.height()) {
// The user requested an out of range area. Get the results 1 line
// at a time.
@@ -3041,9 +3163,9 @@ error::Error GLES2DecoderImpl::HandlePixelStorei(
error::Error GLES2DecoderImpl::GetAttribLocationHelper(
GLuint client_id, uint32 location_shm_id, uint32 location_shm_offset,
const std::string& name_str) {
- ProgramManager::ProgramInfo* info = GetProgramInfo(client_id);
+ ProgramManager::ProgramInfo* info = GetProgramInfoNotShader(
+ client_id, "glGetAttribLocation");
if (!info) {
- SetGLError(GL_INVALID_VALUE, "glGetAttribLocation: unknown program");
return error::kNoError;
}
if (!info->IsValid()) {
@@ -3105,9 +3227,9 @@ error::Error GLES2DecoderImpl::HandleGetAttribLocationBucket(
error::Error GLES2DecoderImpl::GetUniformLocationHelper(
GLuint client_id, uint32 location_shm_id, uint32 location_shm_offset,
const std::string& name_str) {
- ProgramManager::ProgramInfo* info = GetProgramInfo(client_id);
+ ProgramManager::ProgramInfo* info = GetProgramInfoNotShader(
+ client_id, "glUniformLocation");
if (!info) {
- SetGLError(GL_INVALID_VALUE, "glGetUniformLocation: unknown program");
return error::kNoError;
}
if (!info->IsValid()) {
@@ -3518,9 +3640,9 @@ bool GLES2DecoderImpl::GetUniformSetup(
*result_pointer = result;
// Set the result size to 0 so the client does not have to check for success.
result->SetNumResults(0);
- ProgramManager::ProgramInfo* info = GetProgramInfo(program);
+ ProgramManager::ProgramInfo* info = GetProgramInfoNotShader(
+ program, "glGetUniform");
if (!info) {
- SetGLError(GL_INVALID_VALUE, "glGetUniform: unknown program");
return false;
}
if (!info->IsValid()) {
@@ -3636,9 +3758,10 @@ error::Error GLES2DecoderImpl::HandleGetShaderPrecisionFormat(
error::Error GLES2DecoderImpl::HandleGetAttachedShaders(
uint32 immediate_data_size, const gles2::GetAttachedShaders& c) {
uint32 result_size = c.result_size;
- ProgramManager::ProgramInfo* info = GetProgramInfo(c.program);
+ GLuint program = static_cast<GLuint>(c.program);
+ ProgramManager::ProgramInfo* info = GetProgramInfoNotShader(
+ program, "glGetAttachedShaders");
if (!info) {
- SetGLError(GL_INVALID_VALUE, "glGetAttachedShaders: unknown program");
return error::kNoError;
}
typedef gles2::GetAttachedShaders::Result Result;
@@ -3681,14 +3804,9 @@ error::Error GLES2DecoderImpl::HandleGetActiveUniform(
if (result->success != 0) {
return error::kInvalidArguments;
}
- ProgramManager::ProgramInfo* info = GetProgramInfo(program);
+ ProgramManager::ProgramInfo* info = GetProgramInfoNotShader(
+ program, "glGetActiveUniform");
if (!info) {
- SetGLError(GL_INVALID_VALUE, "glGetActiveUniform: unknown program");
- return error::kNoError;
- }
- if (!info->IsValid()) {
- // Program was not linked successfully. (ie, glLinkProgram)
- SetGLError(GL_INVALID_OPERATION, "glGetActiveUniform: program not linked");
return error::kNoError;
}
const ProgramManager::ProgramInfo::UniformInfo* uniform_info =
@@ -3720,14 +3838,9 @@ error::Error GLES2DecoderImpl::HandleGetActiveAttrib(
if (result->success != 0) {
return error::kInvalidArguments;
}
- ProgramManager::ProgramInfo* info = GetProgramInfo(program);
+ ProgramManager::ProgramInfo* info = GetProgramInfoNotShader(
+ program, "glGetActiveAttrib");
if (!info) {
- SetGLError(GL_INVALID_VALUE, "glGetActiveAttrib: unknown program");
- return error::kNoError;
- }
- if (!info->IsValid()) {
- // Program was not linked successfully. (ie, glLinkProgram)
- SetGLError(GL_INVALID_OPERATION, "glGetActiveAttrib: program not linked");
return error::kNoError;
}
const ProgramManager::ProgramInfo::VertexAttribInfo* attrib_info =