OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 package org.chromium.chromoting.cardboard; | 5 package org.chromium.chromoting.cardboard; |
6 | 6 |
7 import static org.chromium.chromoting.cardboard.CardboardUtil.makeFloatBuffer; | 7 import static org.chromium.chromoting.cardboard.CardboardUtil.makeFloatBuffer; |
8 import static org.chromium.chromoting.cardboard.CardboardUtil.makeRectangularTex
tureBuffer; | 8 import static org.chromium.chromoting.cardboard.CardboardUtil.makeRectangularTex
tureBuffer; |
9 | 9 |
10 import android.graphics.Bitmap; | 10 import android.graphics.Bitmap; |
11 import android.graphics.Point; | 11 import android.graphics.Point; |
12 import android.opengl.GLES20; | 12 import android.opengl.GLES20; |
13 | 13 |
14 import org.chromium.chromoting.jni.Client; | 14 import org.chromium.chromoting.jni.Display; |
15 | 15 |
16 import java.nio.FloatBuffer; | 16 import java.nio.FloatBuffer; |
17 | 17 |
18 /** | 18 /** |
19 * Chromoting Cardboard activity desktop, which is used to display host desktop. | 19 * Chromoting Cardboard activity desktop, which is used to display host desktop. |
20 */ | 20 */ |
21 public class Desktop { | 21 public class Desktop { |
22 private static final String VERTEX_SHADER = | 22 private static final String VERTEX_SHADER = |
23 "uniform mat4 u_CombinedMatrix;" | 23 "uniform mat4 u_CombinedMatrix;" |
24 + "attribute vec4 a_Position;" | 24 + "attribute vec4 a_Position;" |
(...skipping 29 matching lines...) Expand all Loading... |
54 | 54 |
55 private static final int POSITION_DATA_SIZE = 3; | 55 private static final int POSITION_DATA_SIZE = 3; |
56 private static final int TEXTURE_COORDINATE_DATA_SIZE = 2; | 56 private static final int TEXTURE_COORDINATE_DATA_SIZE = 2; |
57 | 57 |
58 // Fix the desktop height and adjust width accordingly. | 58 // Fix the desktop height and adjust width accordingly. |
59 private static final float HALF_HEIGHT = 1.0f; | 59 private static final float HALF_HEIGHT = 1.0f; |
60 | 60 |
61 // Number of vertices passed to glDrawArrays(). | 61 // Number of vertices passed to glDrawArrays(). |
62 private static final int VERTICES_NUMBER = 6; | 62 private static final int VERTICES_NUMBER = 6; |
63 | 63 |
64 private final Client mClient; | 64 private final Display mDisplay; |
65 | 65 |
66 private int mVertexShaderHandle; | 66 private int mVertexShaderHandle; |
67 private int mFragmentShaderHandle; | 67 private int mFragmentShaderHandle; |
68 private int mProgramHandle; | 68 private int mProgramHandle; |
69 private int mCombinedMatrixHandle; | 69 private int mCombinedMatrixHandle; |
70 private int mTextureUniformHandle; | 70 private int mTextureUniformHandle; |
71 private int mPositionHandle; | 71 private int mPositionHandle; |
72 private int mTransparentHandle; | 72 private int mTransparentHandle; |
73 private int mTextureDataHandle; | 73 private int mTextureDataHandle; |
74 private int mTextureCoordinateHandle; | 74 private int mTextureCoordinateHandle; |
75 private FloatBuffer mPosition; | 75 private FloatBuffer mPosition; |
76 private float mHalfWidth; | 76 private float mHalfWidth; |
77 | 77 |
78 // Lock to allow multithreaded access to mHalfWidth. | 78 // Lock to allow multithreaded access to mHalfWidth. |
79 private final Object mHalfWidthLock = new Object(); | 79 private final Object mHalfWidthLock = new Object(); |
80 | 80 |
81 private Bitmap mVideoFrame; | 81 private Bitmap mVideoFrame; |
82 | 82 |
83 // Lock to allow multithreaded access to mVideoFrame. | 83 // Lock to allow multithreaded access to mVideoFrame. |
84 private final Object mVideoFrameLock = new Object(); | 84 private final Object mVideoFrameLock = new Object(); |
85 | 85 |
86 // Flag to indicate whether to reload the desktop texture. | 86 // Flag to indicate whether to reload the desktop texture. |
87 private boolean mReloadTexture; | 87 private boolean mReloadTexture; |
88 | 88 |
89 // Lock to allow multithreaded access to mReloadTexture. | 89 // Lock to allow multithreaded access to mReloadTexture. |
90 private final Object mReloadTextureLock = new Object(); | 90 private final Object mReloadTextureLock = new Object(); |
91 | 91 |
92 public Desktop(Client client) { | 92 public Desktop(Display display) { |
93 mClient = client; | 93 mDisplay = display; |
94 mVertexShaderHandle = | 94 mVertexShaderHandle = |
95 ShaderHelper.compileShader(GLES20.GL_VERTEX_SHADER, VERTEX_SHADE
R); | 95 ShaderHelper.compileShader(GLES20.GL_VERTEX_SHADER, VERTEX_SHADE
R); |
96 mFragmentShaderHandle = | 96 mFragmentShaderHandle = |
97 ShaderHelper.compileShader(GLES20.GL_FRAGMENT_SHADER, FRAGMENT_S
HADER); | 97 ShaderHelper.compileShader(GLES20.GL_FRAGMENT_SHADER, FRAGMENT_S
HADER); |
98 mProgramHandle = ShaderHelper.createAndLinkProgram(mVertexShaderHandle, | 98 mProgramHandle = ShaderHelper.createAndLinkProgram(mVertexShaderHandle, |
99 mFragmentShaderHandle, new String[] {"a_Position", "a_TexCoordin
ate", | 99 mFragmentShaderHandle, new String[] {"a_Position", "a_TexCoordin
ate", |
100 "u_CombinedMatrix", "u_Texture"}); | 100 "u_CombinedMatrix", "u_Texture"}); |
101 mCombinedMatrixHandle = | 101 mCombinedMatrixHandle = |
102 GLES20.glGetUniformLocation(mProgramHandle, "u_CombinedMatrix"); | 102 GLES20.glGetUniformLocation(mProgramHandle, "u_CombinedMatrix"); |
103 mTextureUniformHandle = GLES20.glGetUniformLocation(mProgramHandle, "u_T
exture"); | 103 mTextureUniformHandle = GLES20.glGetUniformLocation(mProgramHandle, "u_T
exture"); |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
216 * so that both eyes will have the same texture. | 216 * so that both eyes will have the same texture. |
217 */ | 217 */ |
218 public void maybeLoadDesktopTexture() { | 218 public void maybeLoadDesktopTexture() { |
219 synchronized (mReloadTextureLock) { | 219 synchronized (mReloadTextureLock) { |
220 if (!mReloadTexture) { | 220 if (!mReloadTexture) { |
221 return; | 221 return; |
222 } | 222 } |
223 } | 223 } |
224 | 224 |
225 // TODO(shichengfeng): Record the time desktop drawing takes. | 225 // TODO(shichengfeng): Record the time desktop drawing takes. |
226 Bitmap bitmap = mClient.getDisplay().getVideoFrame(); | 226 Bitmap bitmap = mDisplay.getVideoFrame(); |
227 | 227 |
228 if (bitmap == null) { | 228 if (bitmap == null) { |
229 // This can happen if the client is connected, but a complete video
frame has not yet | 229 // This can happen if the client is connected, but a complete video
frame has not yet |
230 // been decoded. | 230 // been decoded. |
231 return; | 231 return; |
232 } | 232 } |
233 | 233 |
234 updateVideoFrame(bitmap); | 234 updateVideoFrame(bitmap); |
235 | 235 |
236 synchronized (mReloadTextureLock) { | 236 synchronized (mReloadTextureLock) { |
237 mReloadTexture = false; | 237 mReloadTexture = false; |
238 } | 238 } |
239 } | 239 } |
240 | 240 |
241 /** | 241 /** |
242 * Inform this object that a new video frame should be rendered. | 242 * Inform this object that a new video frame should be rendered. |
243 * Called from native display thread. | 243 * Called from native display thread. |
244 */ | 244 */ |
245 public void reloadTexture() { | 245 public void reloadTexture() { |
246 synchronized (mReloadTextureLock) { | 246 synchronized (mReloadTextureLock) { |
247 mReloadTexture = true; | 247 mReloadTexture = true; |
248 } | 248 } |
249 } | 249 } |
250 } | 250 } |
OLD | NEW |