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

Side by Side Diff: ui/gl/yuv420_rgb_converter.cc

Issue 1882953006: Attach YUV420 to RGB converter to GLContext (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 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
« ui/gl/yuv420_rgb_converter.h ('K') | « ui/gl/yuv420_rgb_converter.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2016 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 "ui/gl/yuv420_rgb_converter.h"
6
7 #include "base/strings/stringize_macros.h"
8 #include "base/strings/stringprintf.h"
9 #include "ui/gl/gl_helper.h"
10 #include "ui/gl/gl_implementation.h"
11 #include "ui/gl/scoped_api.h"
12 #include "ui/gl/scoped_binders.h"
13
14 namespace gfx {
15 namespace {
16
17 const char kVertexHeaderCompatiblityProfile[] =
18 "#version 110\n"
19 "#define ATTRIBUTE attribute\n"
20 "#define VARYING varying\n";
21
22 const char kVertexHeaderCoreProfile[] =
23 "#version 150\n"
24 "#define ATTRIBUTE in\n"
25 "#define VARYING out\n";
26
27 const char kFragmentHeaderCompatiblityProfile[] =
28 "#version 110\n"
29 "#extension GL_ARB_texture_rectangle : require\n"
30 "#define VARYING varying\n"
31 "#define FRAGCOLOR gl_FragColor\n"
32 "#define TEX texture2DRect\n";
33
34 const char kFragmentHeaderCoreProfile[] =
35 "#version 150\n"
36 "#define VARYING in\n"
37 "#define TEX texture\n"
38 "#define FRAGCOLOR frag_color\n"
39 "out vec4 FRAGCOLOR;\n";
40
41 // clang-format off
42 const char kVertexShader[] =
43 STRINGIZE(
44 ATTRIBUTE vec2 a_position;
45 uniform vec2 a_texScale;
46 VARYING vec2 v_texCoord;
47 void main() {
48 gl_Position = vec4(a_position.x, a_position.y, 0.0, 1.0);
49 v_texCoord = (a_position + vec2(1.0, 1.0)) * 0.5 * a_texScale;
50 }
51 );
52
53 const char kFragmentShader[] =
54 STRINGIZE(
55 uniform sampler2DRect a_y_texture;
56 uniform sampler2DRect a_uv_texture;
57 VARYING vec2 v_texCoord;
58 void main() {
59 vec3 yuv_adj = vec3(-0.0625, -0.5, -0.5);
60 mat3 yuv_matrix = mat3(vec3(1.164, 1.164, 1.164),
61 vec3(0.0, -.391, 2.018),
62 vec3(1.596, -.813, 0.0));
63 vec3 yuv = vec3(
64 TEX(a_y_texture, v_texCoord).r,
65 TEX(a_uv_texture, v_texCoord * 0.5).rg);
66 FRAGCOLOR = vec4(yuv_matrix * (yuv + yuv_adj), 1.0);
67 }
68 );
69 // clang-format on
70
71 } // namespace
72
73 YUV420RGBConverter::YUV420RGBConverter() {
74 bool use_core_profile =
75 gfx::GetGLImplementation() == gfx::kGLImplementationDesktopGLCoreProfile;
76 gfx::ScopedSetGLToRealGLApi scoped_set_gl_api;
77 glGenFramebuffersEXT(1, &framebuffer_);
78 vertex_buffer_ = gfx::GLHelper::SetupQuadVertexBuffer();
79 vertex_shader_ = gfx::GLHelper::LoadShader(
80 GL_VERTEX_SHADER,
81 base::StringPrintf("%s\n%s",
82 use_core_profile ? kVertexHeaderCoreProfile
83 : kVertexHeaderCompatiblityProfile,
84 kVertexShader)
85 .c_str());
86 fragment_shader_ = gfx::GLHelper::LoadShader(
87 GL_FRAGMENT_SHADER,
88 base::StringPrintf("%s\n%s",
89 use_core_profile ? kFragmentHeaderCoreProfile
90 : kFragmentHeaderCompatiblityProfile,
91 kFragmentShader)
92 .c_str());
93 program_ = gfx::GLHelper::SetupProgram(vertex_shader_, fragment_shader_);
94
95 gfx::ScopedUseProgram use_program(program_);
96 size_location_ = glGetUniformLocation(program_, "a_texScale");
97 DCHECK_NE(-1, size_location_);
98 int y_sampler_location = glGetUniformLocation(program_, "a_y_texture");
99 DCHECK_NE(-1, y_sampler_location);
100 int uv_sampler_location = glGetUniformLocation(program_, "a_uv_texture");
101 DCHECK_NE(-1, uv_sampler_location);
102
103 glUniform1i(y_sampler_location, 0);
104 glUniform1i(uv_sampler_location, 1);
105 }
106
107 YUV420RGBConverter::~YUV420RGBConverter() {
108 gfx::ScopedSetGLToRealGLApi scoped_set_gl_api;
109 glDeleteProgram(program_);
110 glDeleteShader(vertex_shader_);
111 glDeleteShader(fragment_shader_);
112 glDeleteBuffersARB(1, &vertex_buffer_);
113 glDeleteFramebuffersEXT(1, &framebuffer_);
114 }
115
116 void YUV420RGBConverter::CopyTexImage(unsigned target,
117 unsigned y_texture,
118 unsigned uv_texture,
119 const gfx::Size& size) {
120 // Only support for rectangle targets exists so far.
121 DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_RECTANGLE_ARB), target);
122
123 gfx::ScopedSetGLToRealGLApi scoped_set_gl_api;
124
125 DCHECK(!glGetError());
126 glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGB, size.width(), size.height(),
127 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
128 DCHECK(!glGetError());
129
130 GLint target_texture = 0;
Daniele Castagna 2016/04/16 02:45:59 Should this be passed as a parameter instead?
ccameron 2016/04/16 16:19:19 Good idea -- updated.
131 glGetIntegerv(GL_TEXTURE_BINDING_RECTANGLE_ARB, &target_texture);
132 DCHECK(target_texture);
133
134 // Note that state restoration is done explicitly instead of scoped binders to
135 // avoid https://crbug.com/601729.
136 GLint old_active_texture = -1;
137 glGetIntegerv(GL_ACTIVE_TEXTURE, &old_active_texture);
138 DCHECK(!glGetError());
139
140 GLint old_texture0_binding = -1;
141 glActiveTexture(GL_TEXTURE0);
142 glGetIntegerv(GL_TEXTURE_BINDING_RECTANGLE_ARB, &old_texture0_binding);
143 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, y_texture);
144 DCHECK(!glGetError());
145
146 GLint old_texture1_binding = -1;
147 glActiveTexture(GL_TEXTURE1);
148 glGetIntegerv(GL_TEXTURE_BINDING_RECTANGLE_ARB, &old_texture1_binding);
149 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, uv_texture);
150 DCHECK(!glGetError());
151
152 gfx::ScopedFrameBufferBinder framebuffer_binder(framebuffer_);
153 gfx::ScopedViewport viewport(0, 0, size.width(), size.height());
154 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
155 GL_TEXTURE_RECTANGLE_ARB, target_texture, 0);
156 DCHECK_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE),
157 glCheckFramebufferStatusEXT(GL_FRAMEBUFFER));
158 gfx::ScopedUseProgram use_program(program_);
159 glUniform2f(size_location_, size.width(), size.height());
160 DCHECK(!glGetError());
161 gfx::GLHelper::DrawQuad(vertex_buffer_);
162 DCHECK(!glGetError());
163
164 // Restore previous state.
165 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
166 GL_TEXTURE_RECTANGLE_ARB, 0, 0);
167 glActiveTexture(GL_TEXTURE0);
168 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, old_texture0_binding);
169 glActiveTexture(GL_TEXTURE1);
170 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, old_texture1_binding);
171 glActiveTexture(old_active_texture);
172 }
173
174 } // namespace gfx
OLDNEW
« ui/gl/yuv420_rgb_converter.h ('K') | « ui/gl/yuv420_rgb_converter.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698