| 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 1614 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1625 default: | 1625 default: |
| 1626 NOTREACHED(); | 1626 NOTREACHED(); |
| 1627 break; | 1627 break; |
| 1628 } | 1628 } |
| 1629 return renderbuffer; | 1629 return renderbuffer; |
| 1630 } | 1630 } |
| 1631 | 1631 |
| 1632 // Validates the program and location for a glGetUniform call and returns | 1632 // Validates the program and location for a glGetUniform call and returns |
| 1633 // a SizeResult setup to receive the result. Returns true if glGetUniform | 1633 // a SizeResult setup to receive the result. Returns true if glGetUniform |
| 1634 // should be called. | 1634 // should be called. |
| 1635 bool GetUniformSetup( | 1635 bool GetUniformSetup(GLuint program, |
| 1636 GLuint program, GLint fake_location, | 1636 GLint fake_location, |
| 1637 uint32 shm_id, uint32 shm_offset, | 1637 uint32 shm_id, |
| 1638 error::Error* error, GLint* real_location, GLuint* service_id, | 1638 uint32 shm_offset, |
| 1639 void** result, GLenum* result_type); | 1639 error::Error* error, |
| 1640 GLint* real_location, |
| 1641 GLuint* service_id, |
| 1642 void** result, |
| 1643 GLenum* result_type, |
| 1644 GLsizei* result_size); |
| 1640 | 1645 |
| 1641 void MaybeExitOnContextLost(); | 1646 void MaybeExitOnContextLost(); |
| 1642 bool WasContextLost() override; | 1647 bool WasContextLost() override; |
| 1643 bool WasContextLostByRobustnessExtension() override; | 1648 bool WasContextLostByRobustnessExtension() override; |
| 1644 void LoseContext(uint32 reset_status) override; | 1649 void LoseContext(uint32 reset_status) override; |
| 1645 | 1650 |
| 1646 #if defined(OS_MACOSX) | 1651 #if defined(OS_MACOSX) |
| 1647 void ReleaseIOSurfaceForTexture(GLuint texture_id); | 1652 void ReleaseIOSurfaceForTexture(GLuint texture_id); |
| 1648 #endif | 1653 #endif |
| 1649 | 1654 |
| (...skipping 7909 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9559 LOCAL_SET_GL_ERROR( | 9564 LOCAL_SET_GL_ERROR( |
| 9560 GL_INVALID_VALUE, "glGetVertexAttribPointerv", "index out of range."); | 9565 GL_INVALID_VALUE, "glGetVertexAttribPointerv", "index out of range."); |
| 9561 return error::kNoError; | 9566 return error::kNoError; |
| 9562 } | 9567 } |
| 9563 result->SetNumResults(1); | 9568 result->SetNumResults(1); |
| 9564 *result->GetData() = | 9569 *result->GetData() = |
| 9565 state_.vertex_attrib_manager->GetVertexAttrib(index)->offset(); | 9570 state_.vertex_attrib_manager->GetVertexAttrib(index)->offset(); |
| 9566 return error::kNoError; | 9571 return error::kNoError; |
| 9567 } | 9572 } |
| 9568 | 9573 |
| 9569 bool GLES2DecoderImpl::GetUniformSetup( | 9574 bool GLES2DecoderImpl::GetUniformSetup(GLuint program_id, |
| 9570 GLuint program_id, GLint fake_location, | 9575 GLint fake_location, |
| 9571 uint32 shm_id, uint32 shm_offset, | 9576 uint32 shm_id, |
| 9572 error::Error* error, GLint* real_location, | 9577 uint32 shm_offset, |
| 9573 GLuint* service_id, void** result_pointer, GLenum* result_type) { | 9578 error::Error* error, |
| 9579 GLint* real_location, |
| 9580 GLuint* service_id, |
| 9581 void** result_pointer, |
| 9582 GLenum* result_type, |
| 9583 GLsizei* result_size) { |
| 9574 DCHECK(error); | 9584 DCHECK(error); |
| 9575 DCHECK(service_id); | 9585 DCHECK(service_id); |
| 9576 DCHECK(result_pointer); | 9586 DCHECK(result_pointer); |
| 9577 DCHECK(result_type); | 9587 DCHECK(result_type); |
| 9578 DCHECK(real_location); | 9588 DCHECK(real_location); |
| 9579 *error = error::kNoError; | 9589 *error = error::kNoError; |
| 9580 // Make sure we have enough room for the result on failure. | 9590 // Make sure we have enough room for the result on failure. |
| 9581 SizedResult<GLint>* result; | 9591 SizedResult<GLint>* result; |
| 9582 result = GetSharedMemoryAs<SizedResult<GLint>*>( | 9592 result = GetSharedMemoryAs<SizedResult<GLint>*>( |
| 9583 shm_id, shm_offset, SizedResult<GLint>::ComputeSize(0)); | 9593 shm_id, shm_offset, SizedResult<GLint>::ComputeSize(0)); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9615 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glGetUniform", "unknown type"); | 9625 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glGetUniform", "unknown type"); |
| 9616 return false; | 9626 return false; |
| 9617 } | 9627 } |
| 9618 result = GetSharedMemoryAs<SizedResult<GLint>*>( | 9628 result = GetSharedMemoryAs<SizedResult<GLint>*>( |
| 9619 shm_id, shm_offset, SizedResult<GLint>::ComputeSizeFromBytes(size)); | 9629 shm_id, shm_offset, SizedResult<GLint>::ComputeSizeFromBytes(size)); |
| 9620 if (!result) { | 9630 if (!result) { |
| 9621 *error = error::kOutOfBounds; | 9631 *error = error::kOutOfBounds; |
| 9622 return false; | 9632 return false; |
| 9623 } | 9633 } |
| 9624 result->size = size; | 9634 result->size = size; |
| 9635 *result_size = size; |
| 9625 *result_type = type; | 9636 *result_type = type; |
| 9626 return true; | 9637 return true; |
| 9627 } | 9638 } |
| 9628 | 9639 |
| 9629 error::Error GLES2DecoderImpl::HandleGetUniformiv(uint32 immediate_data_size, | 9640 error::Error GLES2DecoderImpl::HandleGetUniformiv(uint32 immediate_data_size, |
| 9630 const void* cmd_data) { | 9641 const void* cmd_data) { |
| 9631 const gles2::cmds::GetUniformiv& c = | 9642 const gles2::cmds::GetUniformiv& c = |
| 9632 *static_cast<const gles2::cmds::GetUniformiv*>(cmd_data); | 9643 *static_cast<const gles2::cmds::GetUniformiv*>(cmd_data); |
| 9633 GLuint program = c.program; | 9644 GLuint program = c.program; |
| 9634 GLint fake_location = c.location; | 9645 GLint fake_location = c.location; |
| 9635 GLuint service_id; | 9646 GLuint service_id; |
| 9636 GLenum result_type; | 9647 GLenum result_type; |
| 9648 GLsizei result_size; |
| 9637 GLint real_location = -1; | 9649 GLint real_location = -1; |
| 9638 Error error; | 9650 Error error; |
| 9639 void* result; | 9651 void* result; |
| 9640 if (GetUniformSetup( | 9652 if (GetUniformSetup(program, fake_location, c.params_shm_id, |
| 9641 program, fake_location, c.params_shm_id, c.params_shm_offset, | 9653 c.params_shm_offset, &error, &real_location, &service_id, |
| 9642 &error, &real_location, &service_id, &result, &result_type)) { | 9654 &result, &result_type, &result_size)) { |
| 9643 glGetUniformiv( | 9655 glGetUniformiv( |
| 9644 service_id, real_location, | 9656 service_id, real_location, |
| 9645 static_cast<cmds::GetUniformiv::Result*>(result)->GetData()); | 9657 static_cast<cmds::GetUniformiv::Result*>(result)->GetData()); |
| 9646 } | 9658 } |
| 9647 return error; | 9659 return error; |
| 9648 } | 9660 } |
| 9649 | 9661 |
| 9650 error::Error GLES2DecoderImpl::HandleGetUniformfv(uint32 immediate_data_size, | 9662 error::Error GLES2DecoderImpl::HandleGetUniformfv(uint32 immediate_data_size, |
| 9651 const void* cmd_data) { | 9663 const void* cmd_data) { |
| 9652 const gles2::cmds::GetUniformfv& c = | 9664 const gles2::cmds::GetUniformfv& c = |
| 9653 *static_cast<const gles2::cmds::GetUniformfv*>(cmd_data); | 9665 *static_cast<const gles2::cmds::GetUniformfv*>(cmd_data); |
| 9654 GLuint program = c.program; | 9666 GLuint program = c.program; |
| 9655 GLint fake_location = c.location; | 9667 GLint fake_location = c.location; |
| 9656 GLuint service_id; | 9668 GLuint service_id; |
| 9657 GLint real_location = -1; | 9669 GLint real_location = -1; |
| 9658 Error error; | 9670 Error error; |
| 9659 typedef cmds::GetUniformfv::Result Result; | 9671 typedef cmds::GetUniformfv::Result Result; |
| 9660 Result* result; | 9672 Result* result; |
| 9661 GLenum result_type; | 9673 GLenum result_type; |
| 9662 if (GetUniformSetup( | 9674 GLsizei result_size; |
| 9663 program, fake_location, c.params_shm_id, c.params_shm_offset, | 9675 if (GetUniformSetup(program, fake_location, c.params_shm_id, |
| 9664 &error, &real_location, &service_id, | 9676 c.params_shm_offset, &error, &real_location, &service_id, |
| 9665 reinterpret_cast<void**>(&result), &result_type)) { | 9677 reinterpret_cast<void**>(&result), &result_type, |
| 9678 &result_size)) { |
| 9666 if (result_type == GL_BOOL || result_type == GL_BOOL_VEC2 || | 9679 if (result_type == GL_BOOL || result_type == GL_BOOL_VEC2 || |
| 9667 result_type == GL_BOOL_VEC3 || result_type == GL_BOOL_VEC4) { | 9680 result_type == GL_BOOL_VEC3 || result_type == GL_BOOL_VEC4) { |
| 9668 GLsizei num_values = result->GetNumResults(); | 9681 GLsizei num_values = result_size / sizeof(Result::Type); |
| 9669 scoped_ptr<GLint[]> temp(new GLint[num_values]); | 9682 scoped_ptr<GLint[]> temp(new GLint[num_values]); |
| 9670 glGetUniformiv(service_id, real_location, temp.get()); | 9683 glGetUniformiv(service_id, real_location, temp.get()); |
| 9671 GLfloat* dst = result->GetData(); | 9684 GLfloat* dst = result->GetData(); |
| 9672 for (GLsizei ii = 0; ii < num_values; ++ii) { | 9685 for (GLsizei ii = 0; ii < num_values; ++ii) { |
| 9673 dst[ii] = (temp[ii] != 0); | 9686 dst[ii] = (temp[ii] != 0); |
| 9674 } | 9687 } |
| 9675 } else { | 9688 } else { |
| 9676 glGetUniformfv(service_id, real_location, result->GetData()); | 9689 glGetUniformfv(service_id, real_location, result->GetData()); |
| 9677 } | 9690 } |
| 9678 } | 9691 } |
| (...skipping 2440 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12119 } | 12132 } |
| 12120 } | 12133 } |
| 12121 | 12134 |
| 12122 // Include the auto-generated part of this file. We split this because it means | 12135 // Include the auto-generated part of this file. We split this because it means |
| 12123 // we can easily edit the non-auto generated parts right here in this file | 12136 // we can easily edit the non-auto generated parts right here in this file |
| 12124 // instead of having to edit some template or the code generator. | 12137 // instead of having to edit some template or the code generator. |
| 12125 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 12138 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
| 12126 | 12139 |
| 12127 } // namespace gles2 | 12140 } // namespace gles2 |
| 12128 } // namespace gpu | 12141 } // namespace gpu |
| OLD | NEW |