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

Side by Side Diff: chrome/browser/android/vr_shell/vr_shell_gpu_renderer.cc

Issue 2729523002: Re-land^2 WebVR compositor bypass via BrowserMain context + mailbox (Closed)
Patch Set: Created 3 years, 9 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
OLDNEW
(Empty)
1 // Copyright 2017 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 "chrome/browser/android/vr_shell/vr_shell_gpu_renderer.h"
6
7 #include "base/logging.h"
8
9 #include <string>
10
11 #define VOID_OFFSET(x) reinterpret_cast<void*>(x)
12 #define SHADER(Src) #Src
13
14 namespace vr_shell {
15
16 namespace {
17
18 const char* kQuadCopyVertex =
19 SHADER(attribute vec4 a_Position;
20 attribute vec2 a_TexCoordinate;
21 varying vec2 v_TexCoordinate;
22 void main() {
23 v_TexCoordinate = a_TexCoordinate;
24 gl_Position = a_Position;
25 });
26
27 const char* kQuadCopyFragment = SHADER(
28 precision highp float;
29 uniform sampler2D u_Texture;
30 varying vec2 v_TexCoordinate;
31 void main() { gl_FragColor = texture2D(u_Texture, v_TexCoordinate); });
32
33 GLuint CompileShader(gpu::gles2::GLES2Interface* gl,
34 GLenum shaderType,
35 const GLchar* shaderSource,
36 std::string& error) {
37 GLuint shaderHandle = gl->CreateShader(shaderType);
38 if (shaderHandle != 0) {
39 // Pass in the shader source.
40 int len = strlen(shaderSource);
41 gl->ShaderSource(shaderHandle, 1, &shaderSource, &len);
42 // Compile the shader.
43 gl->CompileShader(shaderHandle);
44 // Get the compilation status.
45 GLint status = 0;
46 gl->GetShaderiv(shaderHandle, GL_COMPILE_STATUS, &status);
47 if (status == GL_FALSE) {
48 GLint infoLogLength = 0;
49 gl->GetShaderiv(shaderHandle, GL_INFO_LOG_LENGTH, &infoLogLength);
50 GLchar* strInfoLog = new GLchar[infoLogLength + 1];
51 gl->GetShaderInfoLog(shaderHandle, infoLogLength, nullptr, strInfoLog);
52 error = "Error compiling shader: ";
53 error += strInfoLog;
54 delete[] strInfoLog;
55 gl->DeleteShader(shaderHandle);
56 shaderHandle = 0;
57 }
58 }
59
60 return shaderHandle;
61 }
62
63 GLuint CreateAndLinkProgram(gpu::gles2::GLES2Interface* gl,
64 GLuint vertextShaderHandle,
65 GLuint fragmentShaderHandle,
66 std::string& error) {
67 GLuint programHandle = gl->CreateProgram();
68
69 if (programHandle != 0) {
70 // Bind the vertex shader to the program.
71 gl->AttachShader(programHandle, vertextShaderHandle);
72
73 // Bind the fragment shader to the program.
74 gl->AttachShader(programHandle, fragmentShaderHandle);
75
76 // Link the two shaders together into a program.
77 gl->LinkProgram(programHandle);
78
79 // Get the link status.
80 GLint linkStatus = 0;
81 gl->GetProgramiv(programHandle, GL_LINK_STATUS, &linkStatus);
82
83 // If the link failed, delete the program.
84 if (linkStatus == GL_FALSE) {
85 GLint infoLogLength;
86 gl->GetProgramiv(programHandle, GL_INFO_LOG_LENGTH, &infoLogLength);
87
88 GLchar* strInfoLog = new GLchar[infoLogLength + 1];
89 gl->GetProgramInfoLog(programHandle, infoLogLength, nullptr, strInfoLog);
90 error = "Error compiling program: ";
91 error += strInfoLog;
92 delete[] strInfoLog;
93 gl->DeleteProgram(programHandle);
94 programHandle = 0;
95 }
96 }
97
98 return programHandle;
99 }
100
101 static constexpr float kQuadVertices[16] = {
102 // x y u, v
103 -1.f, 1.f, 0.f, 1.f, -1.f, -1.f, 0.f, 0.f,
104 1.f, -1.f, 1.f, 0.f, 1.f, 1.f, 1.f, 1.f};
105 static constexpr int kQuadVerticesSize = sizeof(float) * 16;
106
107 } // namespace
108
109 GpuRenderer::GpuRenderer(gpu::gles2::GLES2Interface* gl) {
110 std::string error;
111 GLuint vertexShaderHandle =
112 CompileShader(gl, GL_VERTEX_SHADER, kQuadCopyVertex, error);
113 CHECK(vertexShaderHandle) << error;
114
115 GLuint fragmentShaderHandle =
116 CompileShader(gl, GL_FRAGMENT_SHADER, kQuadCopyFragment, error);
117 CHECK(fragmentShaderHandle) << error;
118
119 m_programHandle =
120 CreateAndLinkProgram(gl, vertexShaderHandle, fragmentShaderHandle, error);
121 CHECK(m_programHandle) << error;
122
123 // Once the program is linked the shader objects are no longer needed
124 gl->DeleteShader(vertexShaderHandle);
125 gl->DeleteShader(fragmentShaderHandle);
126
127 m_positionHandle = gl->GetAttribLocation(m_programHandle, "a_Position");
128 m_texCoordHandle = gl->GetAttribLocation(m_programHandle, "a_TexCoordinate");
129 m_texUniformHandle = gl->GetUniformLocation(m_programHandle, "u_Texture");
130
131 // TODO(bajones): Figure out why this need to be restored.
132 GLint oldBuffer = 0;
bajones 2017/03/01 18:43:50 Shouldn't need to do this here. I figured it out a
klausw 2017/03/02 08:16:13 Done.
133 gl->GetIntegerv(GL_ARRAY_BUFFER_BINDING, &oldBuffer);
134
135 m_vertexBuffer = 0;
136 gl->GenBuffers(1, &m_vertexBuffer);
137 gl->BindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer);
138 gl->BufferData(GL_ARRAY_BUFFER, kQuadVerticesSize, kQuadVertices,
139 GL_STATIC_DRAW);
140
141 gl->BindBuffer(GL_ARRAY_BUFFER, oldBuffer);
bajones 2017/03/01 18:43:50 Remove. See above comment.
klausw 2017/03/02 08:16:13 Done.
142 }
143
144 GpuRenderer::~GpuRenderer() = default;
145
146 void GpuRenderer::DrawQuad(gpu::gles2::GLES2Interface* gl,
147 GLuint textureHandle) {
148 static constexpr size_t VERTEX_STRIDE = sizeof(float) * 4;
149 static constexpr size_t POSITION_ELEMENTS = 2;
150 static constexpr size_t TEXCOORD_ELEMENTS = 2;
151 static constexpr size_t POSITION_OFFSET = 0;
152 static constexpr size_t TEXCOORD_OFFSET = sizeof(float) * 2;
153
154 gl->Disable(GL_CULL_FACE);
155 gl->DepthMask(GL_FALSE);
156 gl->Disable(GL_DEPTH_TEST);
157 gl->Disable(GL_SCISSOR_TEST);
158 gl->Disable(GL_BLEND);
159 gl->Disable(GL_POLYGON_OFFSET_FILL);
160 gl->Clear(GL_COLOR_BUFFER_BIT);
161 //gl->Viewport(0, 0, 2048, 1024);
162
163 // TODO(bajones): Figure out why this need to be restored.
164 GLint oldBuffer = 0;
165 gl->GetIntegerv(GL_ARRAY_BUFFER_BINDING, &oldBuffer);
bajones 2017/03/01 18:43:50 Remove. See above comment.
klausw 2017/03/07 02:55:54 Done.
166
167 gl->UseProgram(m_programHandle);
168
169 // Bind vertex attributes
170 gl->BindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer);
171
172 gl->EnableVertexAttribArray(m_positionHandle);
173 gl->EnableVertexAttribArray(m_texCoordHandle);
174
175 gl->VertexAttribPointer(m_positionHandle, POSITION_ELEMENTS, GL_FLOAT, false,
176 VERTEX_STRIDE, VOID_OFFSET(POSITION_OFFSET));
177 gl->VertexAttribPointer(m_texCoordHandle, TEXCOORD_ELEMENTS, GL_FLOAT, false,
178 VERTEX_STRIDE, VOID_OFFSET(TEXCOORD_OFFSET));
179
180 // Bind texture. Ideally this should be a 1:1 pixel copy. (Or even more
181 // ideally, a zero copy reuse of the texture.) For now, we're using an
182 // undersized render target for WebVR, so GL_LINEAR makes it look slightly
183 // less chunky. TODO(klausw): change this to GL_NEAREST once we're doing
184 // a 1:1 copy since that should be more efficient.
185 gl->ActiveTexture(GL_TEXTURE0);
186 gl->BindTexture(GL_TEXTURE_2D, textureHandle);
187 gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
188 gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
189 gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
190 gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
191 gl->Uniform1i(m_texUniformHandle, 0);
192
193 gl->DrawArrays(GL_TRIANGLE_FAN, 0, 4);
194
195 gl->DisableVertexAttribArray(m_positionHandle);
196 gl->DisableVertexAttribArray(m_texCoordHandle);
197
198 gl->BindBuffer(GL_ARRAY_BUFFER, oldBuffer);
bajones 2017/03/01 18:43:50 Remove. See above comment.
klausw 2017/03/02 08:16:13 Done.
199 }
200
201 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698