| OLD | NEW |
| 1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 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 "config.h" | 5 #include "config.h" |
| 6 | 6 |
| 7 #if USE(ACCELERATED_COMPOSITING) | 7 #if USE(ACCELERATED_COMPOSITING) |
| 8 | 8 |
| 9 #include "ProgramBinding.h" | 9 #include "ProgramBinding.h" |
| 10 | 10 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 : m_program(0) | 22 : m_program(0) |
| 23 , m_vertexShaderId(0) | 23 , m_vertexShaderId(0) |
| 24 , m_fragmentShaderId(0) | 24 , m_fragmentShaderId(0) |
| 25 , m_initialized(false) | 25 , m_initialized(false) |
| 26 { | 26 { |
| 27 } | 27 } |
| 28 | 28 |
| 29 ProgramBindingBase::~ProgramBindingBase() | 29 ProgramBindingBase::~ProgramBindingBase() |
| 30 { | 30 { |
| 31 // If you hit these asserts, you initialized but forgot to call cleanup(). | 31 // If you hit these asserts, you initialized but forgot to call cleanup(). |
| 32 ASSERT(!m_program); | 32 DCHECK(!m_program); |
| 33 ASSERT(!m_vertexShaderId); | 33 DCHECK(!m_vertexShaderId); |
| 34 ASSERT(!m_fragmentShaderId); | 34 DCHECK(!m_fragmentShaderId); |
| 35 ASSERT(!m_initialized); | 35 DCHECK(!m_initialized); |
| 36 } | 36 } |
| 37 | 37 |
| 38 static bool contextLost(WebGraphicsContext3D* context) | 38 static bool contextLost(WebGraphicsContext3D* context) |
| 39 { | 39 { |
| 40 return (context->getGraphicsResetStatusARB() != GraphicsContext3D::NO_ERROR)
; | 40 return (context->getGraphicsResetStatusARB() != GraphicsContext3D::NO_ERROR)
; |
| 41 } | 41 } |
| 42 | 42 |
| 43 | 43 |
| 44 void ProgramBindingBase::init(WebGraphicsContext3D* context, const std::string&
vertexShader, const std::string& fragmentShader) | 44 void ProgramBindingBase::init(WebGraphicsContext3D* context, const std::string&
vertexShader, const std::string& fragmentShader) |
| 45 { | 45 { |
| 46 TRACE_EVENT0("cc", "ProgramBindingBase::init"); | 46 TRACE_EVENT0("cc", "ProgramBindingBase::init"); |
| 47 m_vertexShaderId = loadShader(context, GraphicsContext3D::VERTEX_SHADER, ver
texShader); | 47 m_vertexShaderId = loadShader(context, GraphicsContext3D::VERTEX_SHADER, ver
texShader); |
| 48 if (!m_vertexShaderId) { | 48 if (!m_vertexShaderId) { |
| 49 if (!contextLost(context)) | 49 if (!contextLost(context)) |
| 50 LOG_ERROR("Failed to create vertex shader"); | 50 LOG(ERROR) << "Failed to create vertex shader"; |
| 51 return; | 51 return; |
| 52 } | 52 } |
| 53 | 53 |
| 54 m_fragmentShaderId = loadShader(context, GraphicsContext3D::FRAGMENT_SHADER,
fragmentShader); | 54 m_fragmentShaderId = loadShader(context, GraphicsContext3D::FRAGMENT_SHADER,
fragmentShader); |
| 55 if (!m_fragmentShaderId) { | 55 if (!m_fragmentShaderId) { |
| 56 GLC(context, context->deleteShader(m_vertexShaderId)); | 56 GLC(context, context->deleteShader(m_vertexShaderId)); |
| 57 m_vertexShaderId = 0; | 57 m_vertexShaderId = 0; |
| 58 if (!contextLost(context)) | 58 if (!contextLost(context)) |
| 59 LOG_ERROR("Failed to create fragment shader"); | 59 LOG(ERROR) << "Failed to create fragment shader"; |
| 60 return; | 60 return; |
| 61 } | 61 } |
| 62 | 62 |
| 63 m_program = createShaderProgram(context, m_vertexShaderId, m_fragmentShaderI
d); | 63 m_program = createShaderProgram(context, m_vertexShaderId, m_fragmentShaderI
d); |
| 64 ASSERT(m_program || contextLost(context)); | 64 DCHECK(m_program || contextLost(context)); |
| 65 } | 65 } |
| 66 | 66 |
| 67 void ProgramBindingBase::link(WebGraphicsContext3D* context) | 67 void ProgramBindingBase::link(WebGraphicsContext3D* context) |
| 68 { | 68 { |
| 69 GLC(context, context->linkProgram(m_program)); | 69 GLC(context, context->linkProgram(m_program)); |
| 70 cleanupShaders(context); | 70 cleanupShaders(context); |
| 71 #ifndef NDEBUG | 71 if (DCHECK_IS_ON()) { |
| 72 int linked = 0; | 72 int linked = 0; |
| 73 GLC(context, context->getProgramiv(m_program, GraphicsContext3D::LINK_STATUS
, &linked)); | 73 GLC(context, context->getProgramiv(m_program, GraphicsContext3D::LINK_ST
ATUS, &linked)); |
| 74 if (!linked) { | 74 if (!linked) { |
| 75 if (!contextLost(context)) | 75 if (!contextLost(context)) |
| 76 LOG_ERROR("Failed to link shader program"); | 76 LOG(ERROR) << "Failed to link shader program"; |
| 77 GLC(context, context->deleteProgram(m_program)); | 77 GLC(context, context->deleteProgram(m_program)); |
| 78 return; | 78 } |
| 79 } | 79 } |
| 80 #endif | |
| 81 } | 80 } |
| 82 | 81 |
| 83 void ProgramBindingBase::cleanup(WebGraphicsContext3D* context) | 82 void ProgramBindingBase::cleanup(WebGraphicsContext3D* context) |
| 84 { | 83 { |
| 85 m_initialized = false; | 84 m_initialized = false; |
| 86 if (!m_program) | 85 if (!m_program) |
| 87 return; | 86 return; |
| 88 | 87 |
| 89 ASSERT(context); | 88 DCHECK(context); |
| 90 GLC(context, context->deleteProgram(m_program)); | 89 GLC(context, context->deleteProgram(m_program)); |
| 91 m_program = 0; | 90 m_program = 0; |
| 92 | 91 |
| 93 cleanupShaders(context); | 92 cleanupShaders(context); |
| 94 } | 93 } |
| 95 | 94 |
| 96 unsigned ProgramBindingBase::loadShader(WebGraphicsContext3D* context, unsigned
type, const std::string& shaderSource) | 95 unsigned ProgramBindingBase::loadShader(WebGraphicsContext3D* context, unsigned
type, const std::string& shaderSource) |
| 97 { | 96 { |
| 98 unsigned shader = context->createShader(type); | 97 unsigned shader = context->createShader(type); |
| 99 if (!shader) | 98 if (!shader) |
| 100 return 0; | 99 return 0; |
| 101 GLC(context, context->shaderSource(shader, shaderSource.data())); | 100 GLC(context, context->shaderSource(shader, shaderSource.data())); |
| 102 GLC(context, context->compileShader(shader)); | 101 GLC(context, context->compileShader(shader)); |
| 103 #ifndef NDEBUG | 102 if (DCHECK_IS_ON()) { |
| 104 int compiled = 0; | 103 int compiled = 0; |
| 105 GLC(context, context->getShaderiv(shader, GraphicsContext3D::COMPILE_STATUS,
&compiled)); | 104 GLC(context, context->getShaderiv(shader, GraphicsContext3D::COMPILE_STA
TUS, &compiled)); |
| 106 if (!compiled) { | 105 if (!compiled) { |
| 107 GLC(context, context->deleteShader(shader)); | 106 GLC(context, context->deleteShader(shader)); |
| 108 return 0; | 107 return 0; |
| 108 } |
| 109 } | 109 } |
| 110 #endif | |
| 111 return shader; | 110 return shader; |
| 112 } | 111 } |
| 113 | 112 |
| 114 unsigned ProgramBindingBase::createShaderProgram(WebGraphicsContext3D* context,
unsigned vertexShader, unsigned fragmentShader) | 113 unsigned ProgramBindingBase::createShaderProgram(WebGraphicsContext3D* context,
unsigned vertexShader, unsigned fragmentShader) |
| 115 { | 114 { |
| 116 unsigned programObject = context->createProgram(); | 115 unsigned programObject = context->createProgram(); |
| 117 if (!programObject) { | 116 if (!programObject) { |
| 118 if (!contextLost(context)) | 117 if (!contextLost(context)) |
| 119 LOG_ERROR("Failed to create shader program"); | 118 LOG(ERROR) << "Failed to create shader program"; |
| 120 return 0; | 119 return 0; |
| 121 } | 120 } |
| 122 | 121 |
| 123 GLC(context, context->attachShader(programObject, vertexShader)); | 122 GLC(context, context->attachShader(programObject, vertexShader)); |
| 124 GLC(context, context->attachShader(programObject, fragmentShader)); | 123 GLC(context, context->attachShader(programObject, fragmentShader)); |
| 125 | 124 |
| 126 // Bind the common attrib locations. | 125 // Bind the common attrib locations. |
| 127 GLC(context, context->bindAttribLocation(programObject, GeometryBinding::pos
itionAttribLocation(), "a_position")); | 126 GLC(context, context->bindAttribLocation(programObject, GeometryBinding::pos
itionAttribLocation(), "a_position")); |
| 128 GLC(context, context->bindAttribLocation(programObject, GeometryBinding::tex
CoordAttribLocation(), "a_texCoord")); | 127 GLC(context, context->bindAttribLocation(programObject, GeometryBinding::tex
CoordAttribLocation(), "a_texCoord")); |
| 129 | 128 |
| 130 return programObject; | 129 return programObject; |
| 131 } | 130 } |
| 132 | 131 |
| 133 void ProgramBindingBase::cleanupShaders(WebGraphicsContext3D* context) | 132 void ProgramBindingBase::cleanupShaders(WebGraphicsContext3D* context) |
| 134 { | 133 { |
| 135 if (m_vertexShaderId) { | 134 if (m_vertexShaderId) { |
| 136 GLC(context, context->deleteShader(m_vertexShaderId)); | 135 GLC(context, context->deleteShader(m_vertexShaderId)); |
| 137 m_vertexShaderId = 0; | 136 m_vertexShaderId = 0; |
| 138 } | 137 } |
| 139 if (m_fragmentShaderId) { | 138 if (m_fragmentShaderId) { |
| 140 GLC(context, context->deleteShader(m_fragmentShaderId)); | 139 GLC(context, context->deleteShader(m_fragmentShaderId)); |
| 141 m_fragmentShaderId = 0; | 140 m_fragmentShaderId = 0; |
| 142 } | 141 } |
| 143 } | 142 } |
| 144 | 143 |
| 145 } // namespace cc | 144 } // namespace cc |
| 146 | 145 |
| 147 #endif // USE(ACCELERATED_COMPOSITING) | 146 #endif // USE(ACCELERATED_COMPOSITING) |
| OLD | NEW |