| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" | 5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
| 6 | 6 |
| 7 #include <stdio.h> | 7 #include <stdio.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <list> | 10 #include <list> |
| (...skipping 1983 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1994 ScopedTexture2DBinder binder(decoder_, id_); | 1994 ScopedTexture2DBinder binder(decoder_, id_); |
| 1995 uint32 image_size = 0; | 1995 uint32 image_size = 0; |
| 1996 GLES2Util::ComputeImageDataSizes( | 1996 GLES2Util::ComputeImageDataSizes( |
| 1997 size.width(), size.height(), format, GL_UNSIGNED_BYTE, 8, &image_size, | 1997 size.width(), size.height(), format, GL_UNSIGNED_BYTE, 8, &image_size, |
| 1998 NULL, NULL); | 1998 NULL, NULL); |
| 1999 | 1999 |
| 2000 if (!memory_tracker_.EnsureGPUMemoryAvailable(image_size)) { | 2000 if (!memory_tracker_.EnsureGPUMemoryAvailable(image_size)) { |
| 2001 return false; | 2001 return false; |
| 2002 } | 2002 } |
| 2003 | 2003 |
| 2004 scoped_array<char> zero_data; | 2004 scoped_ptr<char[]> zero_data; |
| 2005 if (zero) { | 2005 if (zero) { |
| 2006 zero_data.reset(new char[image_size]); | 2006 zero_data.reset(new char[image_size]); |
| 2007 memset(zero_data.get(), 0, image_size); | 2007 memset(zero_data.get(), 0, image_size); |
| 2008 } | 2008 } |
| 2009 | 2009 |
| 2010 WrappedTexImage2D(GL_TEXTURE_2D, | 2010 WrappedTexImage2D(GL_TEXTURE_2D, |
| 2011 0, // mip level | 2011 0, // mip level |
| 2012 format, | 2012 format, |
| 2013 size.width(), | 2013 size.width(), |
| 2014 size.height(), | 2014 size.height(), |
| (...skipping 653 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2668 } | 2668 } |
| 2669 return true; | 2669 return true; |
| 2670 } | 2670 } |
| 2671 | 2671 |
| 2672 bool GLES2DecoderImpl::GenBuffersHelper(GLsizei n, const GLuint* client_ids) { | 2672 bool GLES2DecoderImpl::GenBuffersHelper(GLsizei n, const GLuint* client_ids) { |
| 2673 for (GLsizei ii = 0; ii < n; ++ii) { | 2673 for (GLsizei ii = 0; ii < n; ++ii) { |
| 2674 if (GetBuffer(client_ids[ii])) { | 2674 if (GetBuffer(client_ids[ii])) { |
| 2675 return false; | 2675 return false; |
| 2676 } | 2676 } |
| 2677 } | 2677 } |
| 2678 scoped_array<GLuint> service_ids(new GLuint[n]); | 2678 scoped_ptr<GLuint[]> service_ids(new GLuint[n]); |
| 2679 glGenBuffersARB(n, service_ids.get()); | 2679 glGenBuffersARB(n, service_ids.get()); |
| 2680 for (GLsizei ii = 0; ii < n; ++ii) { | 2680 for (GLsizei ii = 0; ii < n; ++ii) { |
| 2681 CreateBuffer(client_ids[ii], service_ids[ii]); | 2681 CreateBuffer(client_ids[ii], service_ids[ii]); |
| 2682 } | 2682 } |
| 2683 return true; | 2683 return true; |
| 2684 } | 2684 } |
| 2685 | 2685 |
| 2686 bool GLES2DecoderImpl::GenFramebuffersHelper( | 2686 bool GLES2DecoderImpl::GenFramebuffersHelper( |
| 2687 GLsizei n, const GLuint* client_ids) { | 2687 GLsizei n, const GLuint* client_ids) { |
| 2688 for (GLsizei ii = 0; ii < n; ++ii) { | 2688 for (GLsizei ii = 0; ii < n; ++ii) { |
| 2689 if (GetFramebuffer(client_ids[ii])) { | 2689 if (GetFramebuffer(client_ids[ii])) { |
| 2690 return false; | 2690 return false; |
| 2691 } | 2691 } |
| 2692 } | 2692 } |
| 2693 scoped_array<GLuint> service_ids(new GLuint[n]); | 2693 scoped_ptr<GLuint[]> service_ids(new GLuint[n]); |
| 2694 glGenFramebuffersEXT(n, service_ids.get()); | 2694 glGenFramebuffersEXT(n, service_ids.get()); |
| 2695 for (GLsizei ii = 0; ii < n; ++ii) { | 2695 for (GLsizei ii = 0; ii < n; ++ii) { |
| 2696 CreateFramebuffer(client_ids[ii], service_ids[ii]); | 2696 CreateFramebuffer(client_ids[ii], service_ids[ii]); |
| 2697 } | 2697 } |
| 2698 return true; | 2698 return true; |
| 2699 } | 2699 } |
| 2700 | 2700 |
| 2701 bool GLES2DecoderImpl::GenRenderbuffersHelper( | 2701 bool GLES2DecoderImpl::GenRenderbuffersHelper( |
| 2702 GLsizei n, const GLuint* client_ids) { | 2702 GLsizei n, const GLuint* client_ids) { |
| 2703 for (GLsizei ii = 0; ii < n; ++ii) { | 2703 for (GLsizei ii = 0; ii < n; ++ii) { |
| 2704 if (GetRenderbuffer(client_ids[ii])) { | 2704 if (GetRenderbuffer(client_ids[ii])) { |
| 2705 return false; | 2705 return false; |
| 2706 } | 2706 } |
| 2707 } | 2707 } |
| 2708 scoped_array<GLuint> service_ids(new GLuint[n]); | 2708 scoped_ptr<GLuint[]> service_ids(new GLuint[n]); |
| 2709 glGenRenderbuffersEXT(n, service_ids.get()); | 2709 glGenRenderbuffersEXT(n, service_ids.get()); |
| 2710 for (GLsizei ii = 0; ii < n; ++ii) { | 2710 for (GLsizei ii = 0; ii < n; ++ii) { |
| 2711 CreateRenderbuffer(client_ids[ii], service_ids[ii]); | 2711 CreateRenderbuffer(client_ids[ii], service_ids[ii]); |
| 2712 } | 2712 } |
| 2713 return true; | 2713 return true; |
| 2714 } | 2714 } |
| 2715 | 2715 |
| 2716 bool GLES2DecoderImpl::GenTexturesHelper(GLsizei n, const GLuint* client_ids) { | 2716 bool GLES2DecoderImpl::GenTexturesHelper(GLsizei n, const GLuint* client_ids) { |
| 2717 for (GLsizei ii = 0; ii < n; ++ii) { | 2717 for (GLsizei ii = 0; ii < n; ++ii) { |
| 2718 if (GetTexture(client_ids[ii])) { | 2718 if (GetTexture(client_ids[ii])) { |
| 2719 return false; | 2719 return false; |
| 2720 } | 2720 } |
| 2721 } | 2721 } |
| 2722 scoped_array<GLuint> service_ids(new GLuint[n]); | 2722 scoped_ptr<GLuint[]> service_ids(new GLuint[n]); |
| 2723 glGenTextures(n, service_ids.get()); | 2723 glGenTextures(n, service_ids.get()); |
| 2724 for (GLsizei ii = 0; ii < n; ++ii) { | 2724 for (GLsizei ii = 0; ii < n; ++ii) { |
| 2725 CreateTexture(client_ids[ii], service_ids[ii]); | 2725 CreateTexture(client_ids[ii], service_ids[ii]); |
| 2726 } | 2726 } |
| 2727 return true; | 2727 return true; |
| 2728 } | 2728 } |
| 2729 | 2729 |
| 2730 void GLES2DecoderImpl::DeleteBuffersHelper( | 2730 void GLES2DecoderImpl::DeleteBuffersHelper( |
| 2731 GLsizei n, const GLuint* client_ids) { | 2731 GLsizei n, const GLuint* client_ids) { |
| 2732 for (GLsizei ii = 0; ii < n; ++ii) { | 2732 for (GLsizei ii = 0; ii < n; ++ii) { |
| (...skipping 1699 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4432 if (state_.GetStateAsGLint(pname, NULL, num_values)) { | 4432 if (state_.GetStateAsGLint(pname, NULL, num_values)) { |
| 4433 return true; | 4433 return true; |
| 4434 } | 4434 } |
| 4435 return GetHelper(pname, NULL, num_values); | 4435 return GetHelper(pname, NULL, num_values); |
| 4436 } | 4436 } |
| 4437 | 4437 |
| 4438 void GLES2DecoderImpl::DoGetBooleanv(GLenum pname, GLboolean* params) { | 4438 void GLES2DecoderImpl::DoGetBooleanv(GLenum pname, GLboolean* params) { |
| 4439 DCHECK(params); | 4439 DCHECK(params); |
| 4440 GLsizei num_written = 0; | 4440 GLsizei num_written = 0; |
| 4441 if (GetNumValuesReturnedForGLGet(pname, &num_written)) { | 4441 if (GetNumValuesReturnedForGLGet(pname, &num_written)) { |
| 4442 scoped_array<GLint> values(new GLint[num_written]); | 4442 scoped_ptr<GLint[]> values(new GLint[num_written]); |
| 4443 if (!state_.GetStateAsGLint(pname, values.get(), &num_written)) { | 4443 if (!state_.GetStateAsGLint(pname, values.get(), &num_written)) { |
| 4444 GetHelper(pname, values.get(), &num_written); | 4444 GetHelper(pname, values.get(), &num_written); |
| 4445 } | 4445 } |
| 4446 for (GLsizei ii = 0; ii < num_written; ++ii) { | 4446 for (GLsizei ii = 0; ii < num_written; ++ii) { |
| 4447 params[ii] = static_cast<GLboolean>(values[ii]); | 4447 params[ii] = static_cast<GLboolean>(values[ii]); |
| 4448 } | 4448 } |
| 4449 } else { | 4449 } else { |
| 4450 glGetBooleanv(pname, params); | 4450 glGetBooleanv(pname, params); |
| 4451 } | 4451 } |
| 4452 } | 4452 } |
| 4453 | 4453 |
| 4454 void GLES2DecoderImpl::DoGetFloatv(GLenum pname, GLfloat* params) { | 4454 void GLES2DecoderImpl::DoGetFloatv(GLenum pname, GLfloat* params) { |
| 4455 DCHECK(params); | 4455 DCHECK(params); |
| 4456 GLsizei num_written = 0; | 4456 GLsizei num_written = 0; |
| 4457 if (!state_.GetStateAsGLfloat(pname, params, &num_written)) { | 4457 if (!state_.GetStateAsGLfloat(pname, params, &num_written)) { |
| 4458 if (GetHelper(pname, NULL, &num_written)) { | 4458 if (GetHelper(pname, NULL, &num_written)) { |
| 4459 scoped_array<GLint> values(new GLint[num_written]); | 4459 scoped_ptr<GLint[]> values(new GLint[num_written]); |
| 4460 GetHelper(pname, values.get(), &num_written); | 4460 GetHelper(pname, values.get(), &num_written); |
| 4461 for (GLsizei ii = 0; ii < num_written; ++ii) { | 4461 for (GLsizei ii = 0; ii < num_written; ++ii) { |
| 4462 params[ii] = static_cast<GLfloat>(values[ii]); | 4462 params[ii] = static_cast<GLfloat>(values[ii]); |
| 4463 } | 4463 } |
| 4464 } else { | 4464 } else { |
| 4465 glGetFloatv(pname, params); | 4465 glGetFloatv(pname, params); |
| 4466 } | 4466 } |
| 4467 } | 4467 } |
| 4468 } | 4468 } |
| 4469 | 4469 |
| (...skipping 1041 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5511 void GLES2DecoderImpl::DoUniform1fv( | 5511 void GLES2DecoderImpl::DoUniform1fv( |
| 5512 GLint fake_location, GLsizei count, const GLfloat* value) { | 5512 GLint fake_location, GLsizei count, const GLfloat* value) { |
| 5513 GLenum type = 0; | 5513 GLenum type = 0; |
| 5514 GLint real_location = -1; | 5514 GLint real_location = -1; |
| 5515 if (!PrepForSetUniformByLocation( | 5515 if (!PrepForSetUniformByLocation( |
| 5516 fake_location, "glUniform1fv", valid_float_vec1_base_info, | 5516 fake_location, "glUniform1fv", valid_float_vec1_base_info, |
| 5517 &real_location, &type, &count)) { | 5517 &real_location, &type, &count)) { |
| 5518 return; | 5518 return; |
| 5519 } | 5519 } |
| 5520 if (type == GL_BOOL) { | 5520 if (type == GL_BOOL) { |
| 5521 scoped_array<GLint> temp(new GLint[count]); | 5521 scoped_ptr<GLint[]> temp(new GLint[count]); |
| 5522 for (GLsizei ii = 0; ii < count; ++ii) { | 5522 for (GLsizei ii = 0; ii < count; ++ii) { |
| 5523 temp[ii] = static_cast<GLint>(value[ii] != 0.0f); | 5523 temp[ii] = static_cast<GLint>(value[ii] != 0.0f); |
| 5524 } | 5524 } |
| 5525 DoUniform1iv(real_location, count, temp.get()); | 5525 DoUniform1iv(real_location, count, temp.get()); |
| 5526 } else { | 5526 } else { |
| 5527 glUniform1fv(real_location, count, value); | 5527 glUniform1fv(real_location, count, value); |
| 5528 } | 5528 } |
| 5529 } | 5529 } |
| 5530 | 5530 |
| 5531 void GLES2DecoderImpl::DoUniform2fv( | 5531 void GLES2DecoderImpl::DoUniform2fv( |
| 5532 GLint fake_location, GLsizei count, const GLfloat* value) { | 5532 GLint fake_location, GLsizei count, const GLfloat* value) { |
| 5533 GLenum type = 0; | 5533 GLenum type = 0; |
| 5534 GLint real_location = -1; | 5534 GLint real_location = -1; |
| 5535 if (!PrepForSetUniformByLocation( | 5535 if (!PrepForSetUniformByLocation( |
| 5536 fake_location, "glUniform2fv", valid_float_vec2_base_info, | 5536 fake_location, "glUniform2fv", valid_float_vec2_base_info, |
| 5537 &real_location, &type, &count)) { | 5537 &real_location, &type, &count)) { |
| 5538 return; | 5538 return; |
| 5539 } | 5539 } |
| 5540 if (type == GL_BOOL_VEC2) { | 5540 if (type == GL_BOOL_VEC2) { |
| 5541 GLsizei num_values = count * 2; | 5541 GLsizei num_values = count * 2; |
| 5542 scoped_array<GLint> temp(new GLint[num_values]); | 5542 scoped_ptr<GLint[]> temp(new GLint[num_values]); |
| 5543 for (GLsizei ii = 0; ii < num_values; ++ii) { | 5543 for (GLsizei ii = 0; ii < num_values; ++ii) { |
| 5544 temp[ii] = static_cast<GLint>(value[ii] != 0.0f); | 5544 temp[ii] = static_cast<GLint>(value[ii] != 0.0f); |
| 5545 } | 5545 } |
| 5546 glUniform2iv(real_location, count, temp.get()); | 5546 glUniform2iv(real_location, count, temp.get()); |
| 5547 } else { | 5547 } else { |
| 5548 glUniform2fv(real_location, count, value); | 5548 glUniform2fv(real_location, count, value); |
| 5549 } | 5549 } |
| 5550 } | 5550 } |
| 5551 | 5551 |
| 5552 void GLES2DecoderImpl::DoUniform3fv( | 5552 void GLES2DecoderImpl::DoUniform3fv( |
| 5553 GLint fake_location, GLsizei count, const GLfloat* value) { | 5553 GLint fake_location, GLsizei count, const GLfloat* value) { |
| 5554 GLenum type = 0; | 5554 GLenum type = 0; |
| 5555 GLint real_location = -1; | 5555 GLint real_location = -1; |
| 5556 if (!PrepForSetUniformByLocation( | 5556 if (!PrepForSetUniformByLocation( |
| 5557 fake_location, "glUniform3fv", valid_float_vec3_base_info, | 5557 fake_location, "glUniform3fv", valid_float_vec3_base_info, |
| 5558 &real_location, &type, &count)) { | 5558 &real_location, &type, &count)) { |
| 5559 return; | 5559 return; |
| 5560 } | 5560 } |
| 5561 if (type == GL_BOOL_VEC3) { | 5561 if (type == GL_BOOL_VEC3) { |
| 5562 GLsizei num_values = count * 3; | 5562 GLsizei num_values = count * 3; |
| 5563 scoped_array<GLint> temp(new GLint[num_values]); | 5563 scoped_ptr<GLint[]> temp(new GLint[num_values]); |
| 5564 for (GLsizei ii = 0; ii < num_values; ++ii) { | 5564 for (GLsizei ii = 0; ii < num_values; ++ii) { |
| 5565 temp[ii] = static_cast<GLint>(value[ii] != 0.0f); | 5565 temp[ii] = static_cast<GLint>(value[ii] != 0.0f); |
| 5566 } | 5566 } |
| 5567 glUniform3iv(real_location, count, temp.get()); | 5567 glUniform3iv(real_location, count, temp.get()); |
| 5568 } else { | 5568 } else { |
| 5569 glUniform3fv(real_location, count, value); | 5569 glUniform3fv(real_location, count, value); |
| 5570 } | 5570 } |
| 5571 } | 5571 } |
| 5572 | 5572 |
| 5573 void GLES2DecoderImpl::DoUniform4fv( | 5573 void GLES2DecoderImpl::DoUniform4fv( |
| 5574 GLint fake_location, GLsizei count, const GLfloat* value) { | 5574 GLint fake_location, GLsizei count, const GLfloat* value) { |
| 5575 GLenum type = 0; | 5575 GLenum type = 0; |
| 5576 GLint real_location = -1; | 5576 GLint real_location = -1; |
| 5577 if (!PrepForSetUniformByLocation( | 5577 if (!PrepForSetUniformByLocation( |
| 5578 fake_location, "glUniform4fv", valid_float_vec4_base_info, | 5578 fake_location, "glUniform4fv", valid_float_vec4_base_info, |
| 5579 &real_location, &type, &count)) { | 5579 &real_location, &type, &count)) { |
| 5580 return; | 5580 return; |
| 5581 } | 5581 } |
| 5582 if (type == GL_BOOL_VEC4) { | 5582 if (type == GL_BOOL_VEC4) { |
| 5583 GLsizei num_values = count * 4; | 5583 GLsizei num_values = count * 4; |
| 5584 scoped_array<GLint> temp(new GLint[num_values]); | 5584 scoped_ptr<GLint[]> temp(new GLint[num_values]); |
| 5585 for (GLsizei ii = 0; ii < num_values; ++ii) { | 5585 for (GLsizei ii = 0; ii < num_values; ++ii) { |
| 5586 temp[ii] = static_cast<GLint>(value[ii] != 0.0f); | 5586 temp[ii] = static_cast<GLint>(value[ii] != 0.0f); |
| 5587 } | 5587 } |
| 5588 glUniform4iv(real_location, count, temp.get()); | 5588 glUniform4iv(real_location, count, temp.get()); |
| 5589 } else { | 5589 } else { |
| 5590 glUniform4fv(real_location, count, value); | 5590 glUniform4fv(real_location, count, value); |
| 5591 } | 5591 } |
| 5592 } | 5592 } |
| 5593 | 5593 |
| 5594 void GLES2DecoderImpl::DoUniform2iv( | 5594 void GLES2DecoderImpl::DoUniform2iv( |
| (...skipping 558 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6153 if (num_vertices == 0) { | 6153 if (num_vertices == 0) { |
| 6154 LOCAL_SET_GL_ERROR( | 6154 LOCAL_SET_GL_ERROR( |
| 6155 GL_OUT_OF_MEMORY, function_name, "Simulating attrib 0"); | 6155 GL_OUT_OF_MEMORY, function_name, "Simulating attrib 0"); |
| 6156 return false; | 6156 return false; |
| 6157 } | 6157 } |
| 6158 if (attrib_info && | 6158 if (attrib_info && |
| 6159 attrib->CanAccess(max_accessed) && | 6159 attrib->CanAccess(max_accessed) && |
| 6160 attrib->type() == GL_FIXED) { | 6160 attrib->type() == GL_FIXED) { |
| 6161 int num_elements = attrib->size() * kSizeOfFloat; | 6161 int num_elements = attrib->size() * kSizeOfFloat; |
| 6162 int size = num_elements * num_vertices; | 6162 int size = num_elements * num_vertices; |
| 6163 scoped_array<float> data(new float[size]); | 6163 scoped_ptr<float[]> data(new float[size]); |
| 6164 const int32* src = reinterpret_cast<const int32 *>( | 6164 const int32* src = reinterpret_cast<const int32 *>( |
| 6165 attrib->buffer()->GetRange(attrib->offset(), size)); | 6165 attrib->buffer()->GetRange(attrib->offset(), size)); |
| 6166 const int32* end = src + num_elements; | 6166 const int32* end = src + num_elements; |
| 6167 float* dst = data.get(); | 6167 float* dst = data.get(); |
| 6168 while (src != end) { | 6168 while (src != end) { |
| 6169 *dst++ = static_cast<float>(*src++) / 65536.0f; | 6169 *dst++ = static_cast<float>(*src++) / 65536.0f; |
| 6170 } | 6170 } |
| 6171 glBufferSubData(GL_ARRAY_BUFFER, offset, size, data.get()); | 6171 glBufferSubData(GL_ARRAY_BUFFER, offset, size, data.get()); |
| 6172 glVertexAttribPointer( | 6172 glVertexAttribPointer( |
| 6173 attrib->index(), attrib->size(), GL_FLOAT, false, 0, | 6173 attrib->index(), attrib->size(), GL_FLOAT, false, 0, |
| (...skipping 1353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7527 if (!GLES2Util::ComputeImageDataSizes( | 7527 if (!GLES2Util::ComputeImageDataSizes( |
| 7528 width, tile_height, format, type, state_.unpack_alignment, &size, | 7528 width, tile_height, format, type, state_.unpack_alignment, &size, |
| 7529 NULL, NULL)) { | 7529 NULL, NULL)) { |
| 7530 return false; | 7530 return false; |
| 7531 } | 7531 } |
| 7532 } else { | 7532 } else { |
| 7533 tile_height = height; | 7533 tile_height = height; |
| 7534 } | 7534 } |
| 7535 | 7535 |
| 7536 // Assumes the size has already been checked. | 7536 // Assumes the size has already been checked. |
| 7537 scoped_array<char> zero(new char[size]); | 7537 scoped_ptr<char[]> zero(new char[size]); |
| 7538 memset(zero.get(), 0, size); | 7538 memset(zero.get(), 0, size); |
| 7539 glBindTexture(bind_target, service_id); | 7539 glBindTexture(bind_target, service_id); |
| 7540 | 7540 |
| 7541 GLint y = 0; | 7541 GLint y = 0; |
| 7542 while (y < height) { | 7542 while (y < height) { |
| 7543 GLint h = y + tile_height > height ? height - y : tile_height; | 7543 GLint h = y + tile_height > height ? height - y : tile_height; |
| 7544 if (is_texture_immutable || h != height) { | 7544 if (is_texture_immutable || h != height) { |
| 7545 glTexSubImage2D(target, level, 0, y, width, h, format, type, zero.get()); | 7545 glTexSubImage2D(target, level, 0, y, width, h, format, type, zero.get()); |
| 7546 } else { | 7546 } else { |
| 7547 WrappedTexImage2D( | 7547 WrappedTexImage2D( |
| (...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7751 return error::kNoError; | 7751 return error::kNoError; |
| 7752 } | 7752 } |
| 7753 | 7753 |
| 7754 if (texture->IsAttachedToFramebuffer()) { | 7754 if (texture->IsAttachedToFramebuffer()) { |
| 7755 clear_state_dirty_ = true; | 7755 clear_state_dirty_ = true; |
| 7756 // TODO(gman): If textures tracked which framebuffers they were attached to | 7756 // TODO(gman): If textures tracked which framebuffers they were attached to |
| 7757 // we could just mark those framebuffers as not complete. | 7757 // we could just mark those framebuffers as not complete. |
| 7758 framebuffer_manager()->IncFramebufferStateChangeCount(); | 7758 framebuffer_manager()->IncFramebufferStateChangeCount(); |
| 7759 } | 7759 } |
| 7760 | 7760 |
| 7761 scoped_array<int8> zero; | 7761 scoped_ptr<int8[]> zero; |
| 7762 if (!data) { | 7762 if (!data) { |
| 7763 zero.reset(new int8[image_size]); | 7763 zero.reset(new int8[image_size]); |
| 7764 memset(zero.get(), 0, image_size); | 7764 memset(zero.get(), 0, image_size); |
| 7765 data = zero.get(); | 7765 data = zero.get(); |
| 7766 } | 7766 } |
| 7767 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCompressedTexImage2D"); | 7767 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCompressedTexImage2D"); |
| 7768 glCompressedTexImage2D( | 7768 glCompressedTexImage2D( |
| 7769 target, level, internal_format, width, height, border, image_size, data); | 7769 target, level, internal_format, width, height, border, image_size, data); |
| 7770 GLenum error = LOCAL_PEEK_GL_ERROR("glCompressedTexImage2D"); | 7770 GLenum error = LOCAL_PEEK_GL_ERROR("glCompressedTexImage2D"); |
| 7771 if (error == GL_NO_ERROR) { | 7771 if (error == GL_NO_ERROR) { |
| (...skipping 609 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8381 copyHeight != height) { | 8381 copyHeight != height) { |
| 8382 // some part was clipped so clear the sub rect. | 8382 // some part was clipped so clear the sub rect. |
| 8383 uint32 pixels_size = 0; | 8383 uint32 pixels_size = 0; |
| 8384 if (!GLES2Util::ComputeImageDataSizes( | 8384 if (!GLES2Util::ComputeImageDataSizes( |
| 8385 width, height, format, type, state_.unpack_alignment, &pixels_size, | 8385 width, height, format, type, state_.unpack_alignment, &pixels_size, |
| 8386 NULL, NULL)) { | 8386 NULL, NULL)) { |
| 8387 LOCAL_SET_GL_ERROR( | 8387 LOCAL_SET_GL_ERROR( |
| 8388 GL_INVALID_VALUE, "glCopyTexSubImage2D", "dimensions too large"); | 8388 GL_INVALID_VALUE, "glCopyTexSubImage2D", "dimensions too large"); |
| 8389 return; | 8389 return; |
| 8390 } | 8390 } |
| 8391 scoped_array<char> zero(new char[pixels_size]); | 8391 scoped_ptr<char[]> zero(new char[pixels_size]); |
| 8392 memset(zero.get(), 0, pixels_size); | 8392 memset(zero.get(), 0, pixels_size); |
| 8393 glTexSubImage2D( | 8393 glTexSubImage2D( |
| 8394 target, level, xoffset, yoffset, width, height, | 8394 target, level, xoffset, yoffset, width, height, |
| 8395 format, type, zero.get()); | 8395 format, type, zero.get()); |
| 8396 } | 8396 } |
| 8397 | 8397 |
| 8398 if (copyHeight > 0 && copyWidth > 0) { | 8398 if (copyHeight > 0 && copyWidth > 0) { |
| 8399 GLint dx = copyX - x; | 8399 GLint dx = copyX - x; |
| 8400 GLint dy = copyY - y; | 8400 GLint dy = copyY - y; |
| 8401 GLint destX = xoffset + dx; | 8401 GLint destX = xoffset + dx; |
| (...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8710 typedef cmds::GetUniformfv::Result Result; | 8710 typedef cmds::GetUniformfv::Result Result; |
| 8711 Result* result; | 8711 Result* result; |
| 8712 GLenum result_type; | 8712 GLenum result_type; |
| 8713 if (GetUniformSetup( | 8713 if (GetUniformSetup( |
| 8714 program, fake_location, c.params_shm_id, c.params_shm_offset, | 8714 program, fake_location, c.params_shm_id, c.params_shm_offset, |
| 8715 &error, &real_location, &service_id, | 8715 &error, &real_location, &service_id, |
| 8716 reinterpret_cast<void**>(&result), &result_type)) { | 8716 reinterpret_cast<void**>(&result), &result_type)) { |
| 8717 if (result_type == GL_BOOL || result_type == GL_BOOL_VEC2 || | 8717 if (result_type == GL_BOOL || result_type == GL_BOOL_VEC2 || |
| 8718 result_type == GL_BOOL_VEC3 || result_type == GL_BOOL_VEC4) { | 8718 result_type == GL_BOOL_VEC3 || result_type == GL_BOOL_VEC4) { |
| 8719 GLsizei num_values = result->GetNumResults(); | 8719 GLsizei num_values = result->GetNumResults(); |
| 8720 scoped_array<GLint> temp(new GLint[num_values]); | 8720 scoped_ptr<GLint[]> temp(new GLint[num_values]); |
| 8721 glGetUniformiv(service_id, real_location, temp.get()); | 8721 glGetUniformiv(service_id, real_location, temp.get()); |
| 8722 GLfloat* dst = result->GetData(); | 8722 GLfloat* dst = result->GetData(); |
| 8723 for (GLsizei ii = 0; ii < num_values; ++ii) { | 8723 for (GLsizei ii = 0; ii < num_values; ++ii) { |
| 8724 dst[ii] = (temp[ii] != 0); | 8724 dst[ii] = (temp[ii] != 0); |
| 8725 } | 8725 } |
| 8726 } else { | 8726 } else { |
| 8727 glGetUniformfv(service_id, real_location, result->GetData()); | 8727 glGetUniformfv(service_id, real_location, result->GetData()); |
| 8728 } | 8728 } |
| 8729 } | 8729 } |
| 8730 return error; | 8730 return error; |
| (...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9119 } | 9119 } |
| 9120 const GLenum* pnames = GetSharedMemoryAs<const GLenum*>( | 9120 const GLenum* pnames = GetSharedMemoryAs<const GLenum*>( |
| 9121 c.pnames_shm_id, c.pnames_shm_offset, pnames_size); | 9121 c.pnames_shm_id, c.pnames_shm_offset, pnames_size); |
| 9122 if (pnames == NULL) { | 9122 if (pnames == NULL) { |
| 9123 return error::kOutOfBounds; | 9123 return error::kOutOfBounds; |
| 9124 } | 9124 } |
| 9125 | 9125 |
| 9126 // We have to copy them since we use them twice so the client | 9126 // We have to copy them since we use them twice so the client |
| 9127 // can't change them between the time we validate them and the time we use | 9127 // can't change them between the time we validate them and the time we use |
| 9128 // them. | 9128 // them. |
| 9129 scoped_array<GLenum> enums(new GLenum[count]); | 9129 scoped_ptr<GLenum[]> enums(new GLenum[count]); |
| 9130 memcpy(enums.get(), pnames, pnames_size); | 9130 memcpy(enums.get(), pnames, pnames_size); |
| 9131 | 9131 |
| 9132 // Count up the space needed for the result. | 9132 // Count up the space needed for the result. |
| 9133 uint32 num_results = 0; | 9133 uint32 num_results = 0; |
| 9134 for (GLuint ii = 0; ii < count; ++ii) { | 9134 for (GLuint ii = 0; ii < count; ++ii) { |
| 9135 uint32 num = util_.GLGetNumValuesReturned(enums[ii]); | 9135 uint32 num = util_.GLGetNumValuesReturned(enums[ii]); |
| 9136 if (num == 0) { | 9136 if (num == 0) { |
| 9137 LOCAL_SET_GL_ERROR_INVALID_ENUM( | 9137 LOCAL_SET_GL_ERROR_INVALID_ENUM( |
| 9138 "glGetMulitpleCHROMIUM", enums[ii], "pname"); | 9138 "glGetMulitpleCHROMIUM", enums[ii], "pname"); |
| 9139 return error::kNoError; | 9139 return error::kNoError; |
| (...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9455 return false; | 9455 return false; |
| 9456 } | 9456 } |
| 9457 } | 9457 } |
| 9458 | 9458 |
| 9459 if (!features().native_vertex_array_object) { | 9459 if (!features().native_vertex_array_object) { |
| 9460 // Emulated VAO | 9460 // Emulated VAO |
| 9461 for (GLsizei ii = 0; ii < n; ++ii) { | 9461 for (GLsizei ii = 0; ii < n; ++ii) { |
| 9462 CreateVertexAttribManager(client_ids[ii], 0); | 9462 CreateVertexAttribManager(client_ids[ii], 0); |
| 9463 } | 9463 } |
| 9464 } else { | 9464 } else { |
| 9465 scoped_array<GLuint> service_ids(new GLuint[n]); | 9465 scoped_ptr<GLuint[]> service_ids(new GLuint[n]); |
| 9466 | 9466 |
| 9467 glGenVertexArraysOES(n, service_ids.get()); | 9467 glGenVertexArraysOES(n, service_ids.get()); |
| 9468 for (GLsizei ii = 0; ii < n; ++ii) { | 9468 for (GLsizei ii = 0; ii < n; ++ii) { |
| 9469 CreateVertexAttribManager(client_ids[ii], service_ids[ii]); | 9469 CreateVertexAttribManager(client_ids[ii], service_ids[ii]); |
| 9470 } | 9470 } |
| 9471 } | 9471 } |
| 9472 | 9472 |
| 9473 return true; | 9473 return true; |
| 9474 } | 9474 } |
| 9475 | 9475 |
| (...skipping 1049 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10525 return error::kNoError; | 10525 return error::kNoError; |
| 10526 } | 10526 } |
| 10527 | 10527 |
| 10528 // Include the auto-generated part of this file. We split this because it means | 10528 // Include the auto-generated part of this file. We split this because it means |
| 10529 // we can easily edit the non-auto generated parts right here in this file | 10529 // we can easily edit the non-auto generated parts right here in this file |
| 10530 // instead of having to edit some template or the code generator. | 10530 // instead of having to edit some template or the code generator. |
| 10531 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 10531 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
| 10532 | 10532 |
| 10533 } // namespace gles2 | 10533 } // namespace gles2 |
| 10534 } // namespace gpu | 10534 } // namespace gpu |
| OLD | NEW |