Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(142)

Side by Side Diff: gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc

Issue 10124016: Addition of GL_CHROMIUM_copy_texture extension. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Removing dangling error checking code. Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
Property Changes:
Added: svn:eol-style
+ LF
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h"
6
7 #include "base/basictypes.h"
8 #include "gpu/command_buffer/common/types.h"
9 #include "gpu/command_buffer/service/gl_utils.h"
10
11 #define SHADER0(Src) \
12 "#ifdef GL_ES\n"\
13 "precision mediump float;\n"\
14 "#endif\n"\
15 #Src
16 #define SHADER(Src) SHADER0(Src)
17
18 namespace {
19
20 const GLfloat kQuadVertices[] = { -1.0f, -1.0f, 0.0f, 1.0f,
21 1.0f, -1.0f, 0.0f, 1.0f,
22 1.0f, 1.0f, 0.0f, 1.0f,
23 -1.0f, 1.0f, 0.0f, 1.0f };
24
25 const GLfloat kTextureCoords[] = { 0.0f, 0.0f,
26 1.0f, 0.0f,
27 1.0f, 1.0f,
28 0.0f, 1.0f };
29
30 const int kNumShaders = 5;
31 enum ShaderId {
32 VERTEX_SHADER_POS_TEX,
33 FRAGMENT_SHADER_TEX,
34 FRAGMENT_SHADER_TEX_FLIP_Y,
35 FRAGMENT_SHADER_TEX_PREMULTIPLY_ALPHA,
36 FRAGMENT_SHADER_TEX_PREMULTIPLY_ALPHA_FLIP_Y
37 };
38
39 enum ProgramId {
40 PROGRAM_COPY_TEXTURE,
41 PROGRAM_COPY_TEXTURE_FLIP_Y,
42 PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA,
43 PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA_FLIPY
44 };
45
46 // Returns the correct program to evaluate the copy operation for
47 // the CHROMIUM_flipy and premultiply alpha pixel store settings.
48 ProgramId GetProgram(bool flip_y, bool premultiply_alpha) {
49 if (flip_y && premultiply_alpha)
50 return PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA_FLIPY;
51
52 if (flip_y)
53 return PROGRAM_COPY_TEXTURE_FLIP_Y;
54
55 if (premultiply_alpha)
56 return PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA;
57
58 return PROGRAM_COPY_TEXTURE;
59 }
60
61 const char* GetShaderSource(ShaderId shader) {
62 switch (shader) {
63 case VERTEX_SHADER_POS_TEX:
64 return SHADER(
65 attribute vec4 a_position;
66 attribute vec2 a_texCoord;
67 varying vec2 v_uv;
68 void main(void) {
69 gl_Position = a_position;
70 v_uv = a_texCoord;
71 });
72 case FRAGMENT_SHADER_TEX:
73 return SHADER(
74 uniform sampler2D u_texSampler;
75 varying vec2 v_uv;
76 void main(void) {
77 gl_FragColor = texture2D(u_texSampler, v_uv.st);
78 });
79 case FRAGMENT_SHADER_TEX_FLIP_Y:
80 return SHADER(
81 uniform sampler2D u_texSampler;
82 varying vec2 v_uv;
83 void main(void) {
84 gl_FragColor = texture2D(u_texSampler, vec2(v_uv.s, 1.0 - v_uv.t));
85 });
86 case FRAGMENT_SHADER_TEX_PREMULTIPLY_ALPHA:
87 return SHADER(
88 uniform sampler2D u_texSampler;
89 varying vec2 v_uv;
90 void main(void) {
91 gl_FragColor = texture2D(u_texSampler, v_uv.st);
92 gl_FragColor.rgb *= gl_FragColor.a;
93 });
94 case FRAGMENT_SHADER_TEX_PREMULTIPLY_ALPHA_FLIP_Y:
95 return SHADER(
96 uniform sampler2D u_texSampler;
97 varying vec2 v_uv;
98 void main(void) {
99 gl_FragColor = texture2D(u_texSampler, vec2(v_uv.s, 1.0 - v_uv.t));
100 gl_FragColor.rgb *= gl_FragColor.a;
101 });
102 default:
103 return 0;
104 }
105 }
106
107 } // namespace
108
109 void CopyTextureCHROMIUMResourceManager::Initialize() {
110 COMPILE_ASSERT(
111 kVertexPositionAttrib == 0u || kVertexTextureAttrib == 0u,
112 CopyTexture_One_of_these_attribs_must_be_0);
113
114 // Initialize all of the GPU resources required to perform the copy.
115 glGenBuffersARB(2, buffer_ids_);
116 glBindBuffer(GL_ARRAY_BUFFER, buffer_ids_[0]);
117 glBufferData(GL_ARRAY_BUFFER, sizeof(kQuadVertices), kQuadVertices,
118 GL_STATIC_DRAW);
119
120 glBindBuffer(GL_ARRAY_BUFFER, buffer_ids_[1]);
121 glBufferData(GL_ARRAY_BUFFER, sizeof(kTextureCoords), kTextureCoords,
122 GL_STATIC_DRAW);
123
124 glGenFramebuffersEXT(1, &framebuffer_);
125
126 GLuint shaders[kNumShaders];
127 for (int shader = 0; shader < kNumShaders; ++shader) {
128 shaders[shader] = glCreateShader(
129 shader == 0 ? GL_VERTEX_SHADER : GL_FRAGMENT_SHADER);
130 const char* shader_source = GetShaderSource(static_cast<ShaderId>(shader));
131 glShaderSource(shaders[shader], 1, &shader_source, 0);
132 glCompileShader(shaders[shader]);
133 #ifndef NDEBUG
134 GLint compile_status;
135 glGetShaderiv(shaders[shader], GL_COMPILE_STATUS, &compile_status);
136 if (GL_TRUE != compile_status)
137 DLOG(ERROR) << "CopyTextureCHROMIUM: shader compilation failure.";
138 #endif
139 }
140
141 for (int program = 0; program < kNumPrograms; ++program) {
142 programs_[program] = glCreateProgram();
143 glAttachShader(programs_[program], shaders[0]);
144 glAttachShader(programs_[program], shaders[program + 1]);
145
146 glBindAttribLocation(programs_[program], kVertexPositionAttrib,
147 "a_position");
148 glBindAttribLocation(programs_[program], kVertexTextureAttrib,
149 "a_texCoord");
150
151 glLinkProgram(programs_[program]);
152 #ifndef NDEBUG
153 GLint linked;
154 glGetProgramiv(programs_[program], GL_LINK_STATUS, &linked);
155 if (!linked)
156 DLOG(ERROR) << "CopyTextureCHROMIUM: program link failure.";
157 #endif
158
159 sampler_locations_[program] = glGetUniformLocation(programs_[program],
160 "u_texSampler");
161 }
162
163 for (int shader = 0; shader < kNumShaders; ++shader)
164 glDeleteShader(shaders[shader]);
165
166 initialized_ = true;
167 }
168
169 void CopyTextureCHROMIUMResourceManager::Destroy() {
170 if (!initialized_)
171 return;
172
173 glDeleteFramebuffersEXT(1, &framebuffer_);
174
175 for (int program = 0; program < kNumPrograms; ++program)
176 glDeleteProgram(programs_[program]);
177
178 glDeleteBuffersARB(2, buffer_ids_);
179 }
180
181 void CopyTextureCHROMIUMResourceManager::DoCopyTexture(
182 GLenum target,
183 GLuint source_id,
184 GLuint dest_id,
185 GLint level,
186 bool flip_y,
187 bool premultiply_alpha) {
188 if (!initialized_) {
189 DLOG(ERROR) << "CopyTextureCHROMIUM: Uninitialized manager.";
190 return;
191 }
192
193 GLuint program = GetProgram(flip_y, premultiply_alpha);
194 glUseProgram(programs_[program]);
195
196 #ifndef NDEBUG
197 glValidateProgram(programs_[program]);
198 GLint validation_status;
199 glGetProgramiv(programs_[program], GL_VALIDATE_STATUS, &validation_status);
200 if (GL_TRUE != validation_status) {
201 DLOG(ERROR) << "CopyTextureCHROMIUM: Invalid shader.";
202 return;
203 }
204 #endif
205
206 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer_);
207 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, target,
208 dest_id, level);
209
210 #ifndef NDEBUG
211 GLenum fb_status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER);
212 if (GL_FRAMEBUFFER_COMPLETE != fb_status) {
213 DLOG(ERROR) << "CopyTextureCHROMIUM: Incomplete framebuffer.";
214 return;
215 }
216 #endif
217
218 glEnableVertexAttribArray(kVertexPositionAttrib);
219 glEnableVertexAttribArray(kVertexTextureAttrib);
220
221 glBindBuffer(GL_ARRAY_BUFFER, buffer_ids_[0]);
222 glVertexAttribPointer(kVertexPositionAttrib, 4, GL_FLOAT, GL_FALSE,
223 4 * sizeof(GLfloat), 0);
224
225 glBindBuffer(GL_ARRAY_BUFFER, buffer_ids_[1]);
226 glVertexAttribPointer(kVertexTextureAttrib, 2, GL_FLOAT, GL_FALSE,
227 2 * sizeof(GLfloat), 0);
228
229 glActiveTexture(GL_TEXTURE0);
230 glUniform1i(sampler_locations_[program], 0);
231
232 glBindTexture(GL_TEXTURE_2D, source_id);
233 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
234 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
235 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
236 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
237
238 glDisable(GL_DEPTH_TEST);
239 glDisable(GL_SCISSOR_TEST);
240 glDisable(GL_STENCIL_TEST);
241 glDisable(GL_CULL_FACE);
242 glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
243 glDepthMask(GL_FALSE);
244 glDisable(GL_BLEND);
245
246 glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
247 }
248
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h ('k') | gpu/command_buffer/service/gles2_cmd_decoder.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698