Chromium Code Reviews| 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_copy_texture_chromium.h" | 5 #include "gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h" |
| 6 | 6 |
| 7 #include <string.h> | 7 #include <algorithm> |
| 8 | |
| 8 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
| 9 #include "gpu/command_buffer/common/types.h" | 10 #include "gpu/command_buffer/common/types.h" |
| 10 #include "gpu/command_buffer/service/gl_utils.h" | 11 #include "gpu/command_buffer/service/gl_utils.h" |
| 11 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" | 12 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
| 12 | 13 |
| 13 #define SHADER(src) \ | 14 #define SHADER(src) \ |
| 14 "#ifdef GL_ES\n" \ | 15 "#ifdef GL_ES\n" \ |
| 15 "precision mediump float;\n" \ | 16 "precision mediump float;\n" \ |
| 17 "#define TexCoordPrecision mediump\n" \ | |
| 18 "#else\n" \ | |
| 19 "#define TexCoordPrecision\n" \ | |
| 16 "#endif\n" #src | 20 "#endif\n" #src |
| 17 #define SHADER_2D(src) \ | 21 #define SHADER_2D(src) \ |
| 18 "#define SamplerType sampler2D\n" \ | 22 "#define SamplerType sampler2D\n" \ |
| 19 "#define TextureLookup texture2D\n" SHADER(src) | 23 "#define TextureLookup texture2D\n" SHADER(src) |
| 20 #define SHADER_EXTERNAL_OES(src) \ | 24 #define SHADER_EXTERNAL_OES(src) \ |
| 21 "#extension GL_OES_EGL_image_external : require\n" \ | 25 "#extension GL_OES_EGL_image_external : require\n" \ |
| 22 "#define SamplerType samplerExternalOES\n" \ | 26 "#define SamplerType samplerExternalOES\n" \ |
| 23 "#define TextureLookup texture2D\n" SHADER(src) | 27 "#define TextureLookup texture2D\n" SHADER(src) |
| 24 #define SHADERS(src) \ | 28 #define FRAGMENT_SHADERS(src) \ |
| 25 { SHADER_2D(src), SHADER_EXTERNAL_OES(src) } | 29 SHADER_2D(src), SHADER_EXTERNAL_OES(src) |
| 26 | 30 |
| 27 namespace { | 31 namespace { |
| 28 | 32 |
| 29 const GLfloat kQuadVertices[] = { -1.0f, -1.0f, 0.0f, 1.0f, | 33 enum VertexShaderId { |
| 30 1.0f, -1.0f, 0.0f, 1.0f, | 34 VERTEX_SHADER_COPY_TEXTURE, |
| 31 1.0f, 1.0f, 0.0f, 1.0f, | 35 VERTEX_SHADER_COPY_TEXTURE_FLIP_Y, |
| 32 -1.0f, 1.0f, 0.0f, 1.0f }; | 36 NUM_VERTEX_SHADERS, |
| 33 | |
| 34 enum ShaderId { | |
| 35 SHADER_COPY_TEXTURE, | |
| 36 SHADER_COPY_TEXTURE_FLIP_Y, | |
| 37 SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA, | |
| 38 SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA, | |
| 39 SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_FLIP_Y, | |
| 40 SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_FLIP_Y, | |
| 41 NUM_SHADERS, | |
| 42 }; | 37 }; |
| 43 | 38 |
| 44 enum SamplerId { | 39 enum FragmentShaderId { |
| 45 SAMPLER_TEXTURE_2D, | 40 FRAGMENT_SHADER_COPY_TEXTURE_2D, |
| 46 SAMPLER_TEXTURE_EXTERNAL_OES, | 41 FRAGMENT_SHADER_COPY_TEXTURE_EXTERNAL_OES, |
| 47 NUM_SAMPLERS, | 42 FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_2D, |
| 43 FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_EXTERNAL_OES, | |
| 44 FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_2D, | |
| 45 FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_EXTERNAL_OES, | |
| 46 NUM_FRAGMENT_SHADERS, | |
| 48 }; | 47 }; |
| 49 | 48 |
| 50 const char* vertex_shader_source = | 49 const char* vertex_shader_source[NUM_VERTEX_SHADERS] = { |
| 50 // VERTEX_SHADER_COPY_TEXTURE | |
| 51 SHADER( | 51 SHADER( |
| 52 uniform mat4 u_matrix; | 52 uniform mat4 u_matrix; |
| 53 attribute vec4 a_position; | 53 attribute vec4 a_position; |
| 54 varying vec2 v_uv; | 54 varying TexCoordPrecision vec2 v_uv; |
| 55 void main(void) { | 55 void main(void) { |
| 56 gl_Position = u_matrix * a_position; | 56 gl_Position = u_matrix * a_position; |
| 57 v_uv = a_position.xy * 0.5 + vec2(0.5, 0.5); | 57 v_uv = a_position.xy * vec2(0.5, 0.5) + vec2(0.5, 0.5); |
| 58 }); | 58 }), |
| 59 // VERTEX_SHADER_COPY_TEXTURE_FLIP_Y | |
| 60 SHADER( | |
| 61 uniform mat4 u_matrix; | |
| 62 attribute vec4 a_position; | |
| 63 varying TexCoordPrecision vec2 v_uv; | |
| 64 void main(void) { | |
| 65 gl_Position = u_matrix * a_position; | |
| 66 v_uv = a_position.xy * vec2(0.5, -0.5) + vec2(0.5, 0.5); | |
| 67 }), | |
| 68 }; | |
| 59 | 69 |
| 60 const char* fragment_shader_source[NUM_SHADERS][NUM_SAMPLERS] = { | 70 const char* fragment_shader_source[NUM_FRAGMENT_SHADERS] = { |
| 61 // SHADER_COPY_TEXTURE | 71 // FRAGMENT_SHADER_COPY_TEXTURE_* |
| 62 SHADERS( | 72 FRAGMENT_SHADERS( |
| 63 uniform SamplerType u_texSampler; | 73 uniform SamplerType u_sampler; |
| 64 varying vec2 v_uv; | 74 varying TexCoordPrecision vec2 v_uv; |
| 65 void main(void) { | 75 void main(void) { |
| 66 gl_FragColor = TextureLookup(u_texSampler, v_uv.st); | 76 gl_FragColor = TextureLookup(u_sampler, v_uv.st); |
| 67 }), | 77 }), |
| 68 // SHADER_COPY_TEXTURE_FLIP_Y | 78 // FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_* |
| 69 SHADERS( | 79 FRAGMENT_SHADERS( |
| 70 uniform SamplerType u_texSampler; | 80 uniform SamplerType u_sampler; |
| 71 varying vec2 v_uv; | 81 varying TexCoordPrecision vec2 v_uv; |
| 72 void main(void) { | 82 void main(void) { |
| 73 gl_FragColor = TextureLookup(u_texSampler, vec2(v_uv.s, 1.0 - v_uv.t)); | 83 gl_FragColor = TextureLookup(u_sampler, v_uv.st); |
| 74 }), | |
| 75 // SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA | |
| 76 SHADERS( | |
| 77 uniform SamplerType u_texSampler; | |
| 78 varying vec2 v_uv; | |
| 79 void main(void) { | |
| 80 gl_FragColor = TextureLookup(u_texSampler, v_uv.st); | |
| 81 gl_FragColor.rgb *= gl_FragColor.a; | 84 gl_FragColor.rgb *= gl_FragColor.a; |
| 82 }), | 85 }), |
| 83 // SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA | 86 // FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_* |
| 84 SHADERS( | 87 FRAGMENT_SHADERS( |
| 85 uniform SamplerType u_texSampler; | 88 uniform SamplerType u_sampler; |
| 86 varying vec2 v_uv; | 89 varying TexCoordPrecision vec2 v_uv; |
| 87 void main(void) { | 90 void main(void) { |
| 88 gl_FragColor = TextureLookup(u_texSampler, v_uv.st); | 91 gl_FragColor = TextureLookup(u_sampler, v_uv.st); |
| 89 if (gl_FragColor.a > 0.0) | |
| 90 gl_FragColor.rgb /= gl_FragColor.a; | |
| 91 }), | |
| 92 // SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_FLIP_Y | |
| 93 SHADERS( | |
| 94 uniform SamplerType u_texSampler; | |
| 95 varying vec2 v_uv; | |
| 96 void main(void) { | |
| 97 gl_FragColor = TextureLookup(u_texSampler, vec2(v_uv.s, 1.0 - v_uv.t)); | |
| 98 gl_FragColor.rgb *= gl_FragColor.a; | |
| 99 }), | |
| 100 // SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_FLIP_Y | |
| 101 SHADERS( | |
| 102 uniform SamplerType u_texSampler; | |
| 103 varying vec2 v_uv; | |
| 104 void main(void) { | |
| 105 gl_FragColor = TextureLookup(u_texSampler, vec2(v_uv.s, 1.0 - v_uv.t)); | |
| 106 if (gl_FragColor.a > 0.0) | 92 if (gl_FragColor.a > 0.0) |
| 107 gl_FragColor.rgb /= gl_FragColor.a; | 93 gl_FragColor.rgb /= gl_FragColor.a; |
| 108 }), | 94 }), |
| 109 }; | 95 }; |
| 110 | 96 |
| 111 // Returns the correct shader id to evaluate the copy operation for | 97 // Returns the correct vertex shader id to evaluate the copy operation for |
| 112 // the CHROMIUM_flipy and premultiply alpha pixel store settings. | 98 // the CHROMIUM_flipy setting. |
| 113 ShaderId GetShaderId(bool flip_y, | 99 VertexShaderId GetVertexShaderId(bool flip_y) { |
| 114 bool premultiply_alpha, | 100 // bit 0: flip y |
| 115 bool unpremultiply_alpha) { | 101 static VertexShaderId shader_ids[] = { |
| 116 // If both pre-multiply and unpremultiply are requested, then perform no | 102 VERTEX_SHADER_COPY_TEXTURE, |
| 117 // alpha manipulation. | 103 VERTEX_SHADER_COPY_TEXTURE_FLIP_Y, |
| 118 if (premultiply_alpha && unpremultiply_alpha) { | |
| 119 premultiply_alpha = false; | |
| 120 unpremultiply_alpha = false; | |
| 121 } | |
| 122 | |
| 123 // bit 0: Flip_y | |
| 124 // bit 1: Premult | |
| 125 // bit 2: Unpremult | |
| 126 static ShaderId shader_ids[] = { | |
| 127 SHADER_COPY_TEXTURE, | |
| 128 SHADER_COPY_TEXTURE_FLIP_Y, // F | |
| 129 SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA, // P | |
| 130 SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_FLIP_Y, // F P | |
| 131 SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA, // U | |
| 132 SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_FLIP_Y, // F U | |
| 133 SHADER_COPY_TEXTURE, // P U | |
| 134 SHADER_COPY_TEXTURE_FLIP_Y, // F P U | |
| 135 }; | 104 }; |
| 136 | 105 |
| 137 unsigned index = (flip_y ? (1 << 0) : 0) | | 106 unsigned index = flip_y ? 1 : 0; |
| 138 (premultiply_alpha ? (1 << 1) : 0) | | |
| 139 (unpremultiply_alpha ? (1 << 2) : 0); | |
| 140 return shader_ids[index]; | 107 return shader_ids[index]; |
| 141 } | 108 } |
| 142 | 109 |
| 143 SamplerId GetSamplerId(GLenum source_target) { | 110 // Returns the correct fragment shader id to evaluate the copy operation for |
| 144 switch (source_target) { | 111 // the premultiply alpha pixel store settings and target. |
| 112 FragmentShaderId GetFragmentShaderId(bool premultiply_alpha, | |
| 113 bool unpremultiply_alpha, | |
| 114 GLenum target) { | |
| 115 enum { | |
| 116 SAMPLER_2D, | |
| 117 SAMPLER_EXTERNAL_OES, | |
| 118 NUM_SAMPLERS | |
| 119 }; | |
| 120 | |
| 121 // bit 0: premultiply alpha | |
| 122 // bit 1: unpremultiply alpha | |
| 123 static FragmentShaderId shader_ids[][NUM_SAMPLERS] = { | |
| 124 { | |
| 125 FRAGMENT_SHADER_COPY_TEXTURE_2D, | |
| 126 FRAGMENT_SHADER_COPY_TEXTURE_EXTERNAL_OES, | |
| 127 }, | |
| 128 { | |
| 129 FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_2D, | |
| 130 FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_EXTERNAL_OES, | |
| 131 }, | |
| 132 { | |
| 133 FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_2D, | |
| 134 FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_EXTERNAL_OES, | |
| 135 }, | |
| 136 { | |
| 137 FRAGMENT_SHADER_COPY_TEXTURE_2D, | |
| 138 FRAGMENT_SHADER_COPY_TEXTURE_EXTERNAL_OES, | |
| 139 }}; | |
| 140 | |
| 141 unsigned index = (premultiply_alpha ? (1 << 0) : 0) | | |
| 142 (unpremultiply_alpha ? (1 << 1) : 0); | |
| 143 | |
| 144 switch (target) { | |
| 145 case GL_TEXTURE_2D: | 145 case GL_TEXTURE_2D: |
| 146 return SAMPLER_TEXTURE_2D; | 146 return shader_ids[index][SAMPLER_2D]; |
| 147 case GL_TEXTURE_EXTERNAL_OES: | 147 case GL_TEXTURE_EXTERNAL_OES: |
| 148 return SAMPLER_TEXTURE_EXTERNAL_OES; | 148 return shader_ids[index][SAMPLER_EXTERNAL_OES]; |
| 149 default: | |
| 150 break; | |
| 149 } | 151 } |
| 150 | 152 |
| 151 NOTREACHED(); | 153 NOTREACHED(); |
| 152 return SAMPLER_TEXTURE_2D; | 154 return shader_ids[index][SAMPLER_2D]; |
| 153 } | 155 } |
| 154 | 156 |
| 155 void CompileShader(GLuint shader, const char* shader_source) { | 157 void CompileShader(GLuint shader, const char* shader_source) { |
| 156 glShaderSource(shader, 1, &shader_source, 0); | 158 glShaderSource(shader, 1, &shader_source, 0); |
| 157 glCompileShader(shader); | 159 glCompileShader(shader); |
| 158 #ifndef NDEBUG | 160 #ifndef NDEBUG |
| 159 GLint compile_status; | 161 GLint compile_status; |
| 160 glGetShaderiv(shader, GL_COMPILE_STATUS, &compile_status); | 162 glGetShaderiv(shader, GL_COMPILE_STATUS, &compile_status); |
| 161 if (GL_TRUE != compile_status) | 163 if (GL_TRUE != compile_status) |
| 162 DLOG(ERROR) << "CopyTextureCHROMIUM: shader compilation failure."; | 164 DLOG(ERROR) << "CopyTextureCHROMIUM: shader compilation failure."; |
| 163 #endif | 165 #endif |
| 164 } | 166 } |
| 165 | 167 |
| 168 void DeleteShader(GLuint shader) { | |
| 169 if (shader) | |
| 170 glDeleteShader(shader); | |
| 171 } | |
| 172 | |
| 166 } // namespace | 173 } // namespace |
| 167 | 174 |
| 168 namespace gpu { | 175 namespace gpu { |
| 169 | 176 |
| 170 CopyTextureCHROMIUMResourceManager::CopyTextureCHROMIUMResourceManager() | 177 CopyTextureCHROMIUMResourceManager::CopyTextureCHROMIUMResourceManager() |
| 171 : initialized_(false), buffer_id_(0), framebuffer_(0), vertex_shader_(0) { | 178 : initialized_(false), |
| 172 } | 179 vertex_shaders_(NUM_VERTEX_SHADERS, 0), |
| 180 fragment_shaders_(NUM_FRAGMENT_SHADERS, 0), | |
|
piman
2014/04/28 17:28:15
nit: if we're going to preallocate and it's fixed
reveman
2014/04/28 18:40:32
I think it's worth using separate heap allocations
| |
| 181 buffer_id_(0), | |
| 182 framebuffer_(0) {} | |
| 173 | 183 |
| 174 CopyTextureCHROMIUMResourceManager::~CopyTextureCHROMIUMResourceManager() {} | 184 CopyTextureCHROMIUMResourceManager::~CopyTextureCHROMIUMResourceManager() {} |
| 175 | 185 |
| 176 void CopyTextureCHROMIUMResourceManager::Initialize( | 186 void CopyTextureCHROMIUMResourceManager::Initialize( |
| 177 const gles2::GLES2Decoder* decoder) { | 187 const gles2::GLES2Decoder* decoder) { |
| 178 COMPILE_ASSERT( | 188 COMPILE_ASSERT( |
| 179 kVertexPositionAttrib == 0u, | 189 kVertexPositionAttrib == 0u, |
| 180 Position_attribs_must_be_0); | 190 Position_attribs_must_be_0); |
| 181 | 191 |
| 182 // Initialize all of the GPU resources required to perform the copy. | 192 // Initialize all of the GPU resources required to perform the copy. |
| 183 glGenBuffersARB(1, &buffer_id_); | 193 glGenBuffersARB(1, &buffer_id_); |
| 184 glBindBuffer(GL_ARRAY_BUFFER, buffer_id_); | 194 glBindBuffer(GL_ARRAY_BUFFER, buffer_id_); |
| 185 glBufferData(GL_ARRAY_BUFFER, sizeof(kQuadVertices), kQuadVertices, | 195 const GLfloat kQuadVertices[] = {-1.0f, -1.0f, |
| 186 GL_STATIC_DRAW); | 196 1.0f, -1.0f, |
| 197 1.0f, 1.0f, | |
| 198 -1.0f, 1.0f}; | |
| 199 glBufferData( | |
| 200 GL_ARRAY_BUFFER, sizeof(kQuadVertices), kQuadVertices, GL_STATIC_DRAW); | |
| 187 | 201 |
| 188 glGenFramebuffersEXT(1, &framebuffer_); | 202 glGenFramebuffersEXT(1, &framebuffer_); |
| 189 | 203 |
| 190 vertex_shader_ = glCreateShader(GL_VERTEX_SHADER); | |
| 191 CompileShader(vertex_shader_, vertex_shader_source); | |
| 192 | |
| 193 decoder->RestoreBufferBindings(); | 204 decoder->RestoreBufferBindings(); |
| 194 | 205 |
| 195 initialized_ = true; | 206 initialized_ = true; |
| 196 } | 207 } |
| 197 | 208 |
| 198 void CopyTextureCHROMIUMResourceManager::Destroy() { | 209 void CopyTextureCHROMIUMResourceManager::Destroy() { |
| 199 if (!initialized_) | 210 if (!initialized_) |
| 200 return; | 211 return; |
| 201 | 212 |
| 202 glDeleteFramebuffersEXT(1, &framebuffer_); | 213 glDeleteFramebuffersEXT(1, &framebuffer_); |
| 203 | 214 |
| 204 glDeleteShader(vertex_shader_); | 215 std::for_each(vertex_shaders_.begin(), vertex_shaders_.end(), DeleteShader); |
| 216 std::for_each( | |
| 217 fragment_shaders_.begin(), fragment_shaders_.end(), DeleteShader); | |
| 218 | |
| 205 for (ProgramMap::const_iterator it = programs_.begin(); it != programs_.end(); | 219 for (ProgramMap::const_iterator it = programs_.begin(); it != programs_.end(); |
| 206 ++it) { | 220 ++it) { |
| 207 const ProgramInfo& info = it->second; | 221 const ProgramInfo& info = it->second; |
| 208 glDeleteProgram(info.program); | 222 glDeleteProgram(info.program); |
| 209 } | 223 } |
| 210 | 224 |
| 211 glDeleteBuffersARB(1, &buffer_id_); | 225 glDeleteBuffersARB(1, &buffer_id_); |
| 212 } | 226 } |
| 213 | 227 |
| 214 void CopyTextureCHROMIUMResourceManager::DoCopyTexture( | 228 void CopyTextureCHROMIUMResourceManager::DoCopyTexture( |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 246 bool premultiply_alpha, | 260 bool premultiply_alpha, |
| 247 bool unpremultiply_alpha, | 261 bool unpremultiply_alpha, |
| 248 const GLfloat transform_matrix[16]) { | 262 const GLfloat transform_matrix[16]) { |
| 249 DCHECK(source_target == GL_TEXTURE_2D || | 263 DCHECK(source_target == GL_TEXTURE_2D || |
| 250 source_target == GL_TEXTURE_EXTERNAL_OES); | 264 source_target == GL_TEXTURE_EXTERNAL_OES); |
| 251 if (!initialized_) { | 265 if (!initialized_) { |
| 252 DLOG(ERROR) << "CopyTextureCHROMIUM: Uninitialized manager."; | 266 DLOG(ERROR) << "CopyTextureCHROMIUM: Uninitialized manager."; |
| 253 return; | 267 return; |
| 254 } | 268 } |
| 255 | 269 |
| 256 ShaderId shader_id = | 270 VertexShaderId vertex_shader_id = GetVertexShaderId(flip_y); |
| 257 GetShaderId(flip_y, premultiply_alpha, unpremultiply_alpha); | 271 DCHECK_LT(vertex_shader_id, vertex_shaders_.size()); |
| 258 SamplerId sampler_id = GetSamplerId(source_target); | 272 GLuint* vertex_shader = &vertex_shaders_[vertex_shader_id]; |
| 273 if (!*vertex_shader) { | |
| 274 *vertex_shader = glCreateShader(GL_VERTEX_SHADER); | |
| 275 CompileShader(*vertex_shader, vertex_shader_source[vertex_shader_id]); | |
| 276 } | |
| 259 | 277 |
| 260 ProgramMapKey key(shader_id, sampler_id); | 278 FragmentShaderId fragment_shader_id = GetFragmentShaderId( |
| 279 premultiply_alpha, unpremultiply_alpha, source_target); | |
| 280 DCHECK_LT(fragment_shader_id, fragment_shaders_.size()); | |
| 281 GLuint* fragment_shader = &fragment_shaders_[fragment_shader_id]; | |
| 282 if (!*fragment_shader) { | |
| 283 *fragment_shader = glCreateShader(GL_FRAGMENT_SHADER); | |
| 284 CompileShader(*fragment_shader, fragment_shader_source[fragment_shader_id]); | |
| 285 } | |
| 286 | |
| 287 ProgramMapKey key(vertex_shader_id, fragment_shader_id); | |
| 261 ProgramInfo* info = &programs_[key]; | 288 ProgramInfo* info = &programs_[key]; |
| 262 // Create program if necessary. | 289 // Create program if necessary. |
| 263 if (!info->program) { | 290 if (!info->program) { |
| 264 GLuint shader = glCreateShader(GL_FRAGMENT_SHADER); | |
| 265 CompileShader(shader, fragment_shader_source[shader_id][sampler_id]); | |
| 266 info->program = glCreateProgram(); | 291 info->program = glCreateProgram(); |
| 267 glAttachShader(info->program, vertex_shader_); | 292 glAttachShader(info->program, *vertex_shader); |
| 268 glAttachShader(info->program, shader); | 293 glAttachShader(info->program, *fragment_shader); |
| 269 glBindAttribLocation(info->program, kVertexPositionAttrib, "a_position"); | 294 glBindAttribLocation(info->program, kVertexPositionAttrib, "a_position"); |
| 270 glLinkProgram(info->program); | 295 glLinkProgram(info->program); |
| 271 #ifndef NDEBUG | 296 #ifndef NDEBUG |
| 272 GLint linked; | 297 GLint linked; |
| 273 glGetProgramiv(info->program, GL_LINK_STATUS, &linked); | 298 glGetProgramiv(info->program, GL_LINK_STATUS, &linked); |
| 274 if (!linked) | 299 if (!linked) |
| 275 DLOG(ERROR) << "CopyTextureCHROMIUM: program link failure."; | 300 DLOG(ERROR) << "CopyTextureCHROMIUM: program link failure."; |
| 276 #endif | 301 #endif |
| 277 info->sampler_locations = | |
| 278 glGetUniformLocation(info->program, "u_texSampler"); | |
| 279 info->matrix_handle = glGetUniformLocation(info->program, "u_matrix"); | 302 info->matrix_handle = glGetUniformLocation(info->program, "u_matrix"); |
| 280 glDeleteShader(shader); | 303 info->sampler_handle = glGetUniformLocation(info->program, "u_sampler"); |
| 281 } | 304 } |
| 282 glUseProgram(info->program); | 305 glUseProgram(info->program); |
| 283 | 306 |
| 284 #ifndef NDEBUG | 307 #ifndef NDEBUG |
| 285 glValidateProgram(info->program); | 308 glValidateProgram(info->program); |
| 286 GLint validation_status; | 309 GLint validation_status; |
| 287 glGetProgramiv(info->program, GL_VALIDATE_STATUS, &validation_status); | 310 glGetProgramiv(info->program, GL_VALIDATE_STATUS, &validation_status); |
| 288 if (GL_TRUE != validation_status) { | 311 if (GL_TRUE != validation_status) { |
| 289 DLOG(ERROR) << "CopyTextureCHROMIUM: Invalid shader."; | 312 DLOG(ERROR) << "CopyTextureCHROMIUM: Invalid shader."; |
| 290 return; | 313 return; |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 308 GLenum fb_status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); | 331 GLenum fb_status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); |
| 309 if (GL_FRAMEBUFFER_COMPLETE != fb_status) { | 332 if (GL_FRAMEBUFFER_COMPLETE != fb_status) { |
| 310 DLOG(ERROR) << "CopyTextureCHROMIUM: Incomplete framebuffer."; | 333 DLOG(ERROR) << "CopyTextureCHROMIUM: Incomplete framebuffer."; |
| 311 } else | 334 } else |
| 312 #endif | 335 #endif |
| 313 { | 336 { |
| 314 decoder->ClearAllAttributes(); | 337 decoder->ClearAllAttributes(); |
| 315 glEnableVertexAttribArray(kVertexPositionAttrib); | 338 glEnableVertexAttribArray(kVertexPositionAttrib); |
| 316 | 339 |
| 317 glBindBuffer(GL_ARRAY_BUFFER, buffer_id_); | 340 glBindBuffer(GL_ARRAY_BUFFER, buffer_id_); |
| 318 glVertexAttribPointer(kVertexPositionAttrib, 4, GL_FLOAT, GL_FALSE, | 341 glVertexAttribPointer(kVertexPositionAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0); |
| 319 4 * sizeof(GLfloat), 0); | |
| 320 | 342 |
| 321 glUniform1i(info->sampler_locations, 0); | 343 glUniform1i(info->sampler_handle, 0); |
| 322 | 344 |
| 323 glBindTexture(source_target, source_id); | 345 glBindTexture(source_target, source_id); |
| 324 glTexParameterf(source_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | 346 glTexParameterf(source_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
| 325 glTexParameterf(source_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | 347 glTexParameterf(source_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
| 326 glTexParameteri(source_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | 348 glTexParameteri(source_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
| 327 glTexParameteri(source_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); | 349 glTexParameteri(source_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
| 328 | 350 |
| 329 glDisable(GL_DEPTH_TEST); | 351 glDisable(GL_DEPTH_TEST); |
| 330 glDisable(GL_SCISSOR_TEST); | 352 glDisable(GL_SCISSOR_TEST); |
| 331 glDisable(GL_STENCIL_TEST); | 353 glDisable(GL_STENCIL_TEST); |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 342 decoder->RestoreTextureState(source_id); | 364 decoder->RestoreTextureState(source_id); |
| 343 decoder->RestoreTextureState(dest_id); | 365 decoder->RestoreTextureState(dest_id); |
| 344 decoder->RestoreTextureUnitBindings(0); | 366 decoder->RestoreTextureUnitBindings(0); |
| 345 decoder->RestoreActiveTexture(); | 367 decoder->RestoreActiveTexture(); |
| 346 decoder->RestoreProgramBindings(); | 368 decoder->RestoreProgramBindings(); |
| 347 decoder->RestoreBufferBindings(); | 369 decoder->RestoreBufferBindings(); |
| 348 decoder->RestoreFramebufferBindings(); | 370 decoder->RestoreFramebufferBindings(); |
| 349 decoder->RestoreGlobalState(); | 371 decoder->RestoreGlobalState(); |
| 350 } | 372 } |
| 351 | 373 |
| 352 } // namespace | 374 } // namespace gpu |
| 353 | 375 |
| OLD | NEW |