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

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

Issue 2005463002: Attach YUV420 to RGB converter to GLContext (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@2704
Patch Set: Created 4 years, 7 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
« no previous file with comments | « ui/gl/yuv_to_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/yuv_to_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 gl {
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 YUVToRGBConverter::YUVToRGBConverter() {
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 YUVToRGBConverter::~YUVToRGBConverter() {
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 YUVToRGBConverter::CopyYUV420ToRGB(unsigned target,
117 unsigned y_texture,
118 unsigned uv_texture,
119 const gfx::Size& size,
120 unsigned rgb_texture) {
121 // Only support for rectangle targets exists so far.
122 DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_RECTANGLE_ARB), target);
123 gfx::ScopedSetGLToRealGLApi scoped_set_gl_api;
124
125 // Note that state restoration is done explicitly instead of scoped binders to
126 // avoid https://crbug.com/601729.
127 GLint old_active_texture = -1;
128 glGetIntegerv(GL_ACTIVE_TEXTURE, &old_active_texture);
129 GLint old_texture0_binding = -1;
130 glActiveTexture(GL_TEXTURE0);
131 glGetIntegerv(GL_TEXTURE_BINDING_RECTANGLE_ARB, &old_texture0_binding);
132 GLint old_texture1_binding = -1;
133 glActiveTexture(GL_TEXTURE1);
134 glGetIntegerv(GL_TEXTURE_BINDING_RECTANGLE_ARB, &old_texture1_binding);
135
136 // Allocate the rgb texture.
137 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, rgb_texture);
138 glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGB, size.width(), size.height(),
139 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
140
141 // Set up and issue the draw call.
142 glActiveTexture(GL_TEXTURE0);
143 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, y_texture);
144 glActiveTexture(GL_TEXTURE1);
145 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, uv_texture);
146 gfx::ScopedFrameBufferBinder framebuffer_binder(framebuffer_);
147 gfx::ScopedViewport viewport(0, 0, size.width(), size.height());
148 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
149 GL_TEXTURE_RECTANGLE_ARB, rgb_texture, 0);
150 DCHECK_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE),
151 glCheckFramebufferStatusEXT(GL_FRAMEBUFFER));
152 gfx::ScopedUseProgram use_program(program_);
153 glUniform2f(size_location_, size.width(), size.height());
154 gfx::GLHelper::DrawQuad(vertex_buffer_);
155
156 // Restore previous state.
157 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
158 GL_TEXTURE_RECTANGLE_ARB, 0, 0);
159 glActiveTexture(GL_TEXTURE0);
160 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, old_texture0_binding);
161 glActiveTexture(GL_TEXTURE1);
162 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, old_texture1_binding);
163 glActiveTexture(old_active_texture);
164 }
165
166 } // namespace gl
OLDNEW
« no previous file with comments | « ui/gl/yuv_to_rgb_converter.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698