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

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

Issue 2456213002: WebVR: implement SetSurfaceHandleCHROMIUM extension for gvr_device.
Patch Set: Created 4 years, 1 month 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
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 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 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" 5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h"
6 6
7 #include <limits.h> 7 #include <limits.h>
8 #include <stddef.h> 8 #include <stddef.h>
9 #include <stdint.h> 9 #include <stdint.h>
10 #include <stdio.h> 10 #include <stdio.h>
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
58 #include "gpu/command_buffer/service/program_manager.h" 58 #include "gpu/command_buffer/service/program_manager.h"
59 #include "gpu/command_buffer/service/query_manager.h" 59 #include "gpu/command_buffer/service/query_manager.h"
60 #include "gpu/command_buffer/service/renderbuffer_manager.h" 60 #include "gpu/command_buffer/service/renderbuffer_manager.h"
61 #include "gpu/command_buffer/service/sampler_manager.h" 61 #include "gpu/command_buffer/service/sampler_manager.h"
62 #include "gpu/command_buffer/service/shader_manager.h" 62 #include "gpu/command_buffer/service/shader_manager.h"
63 #include "gpu/command_buffer/service/shader_translator.h" 63 #include "gpu/command_buffer/service/shader_translator.h"
64 #include "gpu/command_buffer/service/texture_manager.h" 64 #include "gpu/command_buffer/service/texture_manager.h"
65 #include "gpu/command_buffer/service/transform_feedback_manager.h" 65 #include "gpu/command_buffer/service/transform_feedback_manager.h"
66 #include "gpu/command_buffer/service/vertex_array_manager.h" 66 #include "gpu/command_buffer/service/vertex_array_manager.h"
67 #include "gpu/command_buffer/service/vertex_attrib_manager.h" 67 #include "gpu/command_buffer/service/vertex_attrib_manager.h"
68 #include "gpu/ipc/common/gpu_surface_lookup.h"
68 #include "third_party/angle/src/image_util/loadimage.h" 69 #include "third_party/angle/src/image_util/loadimage.h"
69 #include "third_party/smhasher/src/City.h" 70 #include "third_party/smhasher/src/City.h"
70 #include "ui/gfx/buffer_types.h" 71 #include "ui/gfx/buffer_types.h"
71 #include "ui/gfx/geometry/point.h" 72 #include "ui/gfx/geometry/point.h"
72 #include "ui/gfx/geometry/rect.h" 73 #include "ui/gfx/geometry/rect.h"
73 #include "ui/gfx/geometry/rect_conversions.h" 74 #include "ui/gfx/geometry/rect_conversions.h"
74 #include "ui/gfx/geometry/size.h" 75 #include "ui/gfx/geometry/size.h"
75 #include "ui/gfx/gpu_memory_buffer.h" 76 #include "ui/gfx/gpu_memory_buffer.h"
76 #include "ui/gfx/overlay_transform.h" 77 #include "ui/gfx/overlay_transform.h"
77 #include "ui/gfx/transform.h" 78 #include "ui/gfx/transform.h"
78 #include "ui/gl/ca_renderer_layer_params.h" 79 #include "ui/gl/ca_renderer_layer_params.h"
79 #include "ui/gl/gl_bindings.h" 80 #include "ui/gl/gl_bindings.h"
80 #include "ui/gl/gl_context.h" 81 #include "ui/gl/gl_context.h"
81 #include "ui/gl/gl_fence.h" 82 #include "ui/gl/gl_fence.h"
82 #include "ui/gl/gl_image.h" 83 #include "ui/gl/gl_image.h"
83 #include "ui/gl/gl_implementation.h" 84 #include "ui/gl/gl_implementation.h"
84 #include "ui/gl/gl_surface.h" 85 #include "ui/gl/gl_surface.h"
86 #include "ui/gl/gl_surface_egl.h"
85 #include "ui/gl/gl_version_info.h" 87 #include "ui/gl/gl_version_info.h"
86 #include "ui/gl/gpu_timing.h" 88 #include "ui/gl/gpu_timing.h"
87 89
88 #if defined(OS_MACOSX) 90 #if defined(OS_MACOSX)
89 #include <IOSurface/IOSurface.h> 91 #include <IOSurface/IOSurface.h>
90 // Note that this must be included after gl_bindings.h to avoid conflicts. 92 // Note that this must be included after gl_bindings.h to avoid conflicts.
91 #include <OpenGL/CGLIOSurface.h> 93 #include <OpenGL/CGLIOSurface.h>
92 #endif 94 #endif
93 95
94 namespace gpu { 96 namespace gpu {
(...skipping 954 matching lines...) Expand 10 before | Expand all | Expand 10 after
1049 1051
1050 void DoMatrixLoadfCHROMIUM(GLenum matrix_mode, 1052 void DoMatrixLoadfCHROMIUM(GLenum matrix_mode,
1051 const volatile GLfloat* matrix); 1053 const volatile GLfloat* matrix);
1052 void DoMatrixLoadIdentityCHROMIUM(GLenum matrix_mode); 1054 void DoMatrixLoadIdentityCHROMIUM(GLenum matrix_mode);
1053 void DoScheduleCALayerInUseQueryCHROMIUM(GLsizei count, 1055 void DoScheduleCALayerInUseQueryCHROMIUM(GLsizei count,
1054 const volatile GLuint* textures); 1056 const volatile GLuint* textures);
1055 1057
1056 void DoFlushMappedBufferRange( 1058 void DoFlushMappedBufferRange(
1057 GLenum target, GLintptr offset, GLsizeiptr size); 1059 GLenum target, GLintptr offset, GLsizeiptr size);
1058 1060
1061 void DoSetSurfaceHandleCHROMIUM(GLint surface_handle);
1062
1059 // Creates a Program for the given program. 1063 // Creates a Program for the given program.
1060 Program* CreateProgram(GLuint client_id, GLuint service_id) { 1064 Program* CreateProgram(GLuint client_id, GLuint service_id) {
1061 return program_manager()->CreateProgram(client_id, service_id); 1065 return program_manager()->CreateProgram(client_id, service_id);
1062 } 1066 }
1063 1067
1064 // Gets the program info for the given program. Returns NULL if none exists. 1068 // Gets the program info for the given program. Returns NULL if none exists.
1065 Program* GetProgram(GLuint client_id) { 1069 Program* GetProgram(GLuint client_id) {
1066 return program_manager()->GetProgram(client_id); 1070 return program_manager()->GetProgram(client_id);
1067 } 1071 }
1068 1072
(...skipping 1077 matching lines...) Expand 10 before | Expand all | Expand 10 after
2146 Error Handle##name(uint32_t immediate_data_size, const volatile void* data); 2150 Error Handle##name(uint32_t immediate_data_size, const volatile void* data);
2147 2151
2148 GLES2_COMMAND_LIST(GLES2_CMD_OP) 2152 GLES2_COMMAND_LIST(GLES2_CMD_OP)
2149 2153
2150 #undef GLES2_CMD_OP 2154 #undef GLES2_CMD_OP
2151 2155
2152 // The GL context this decoder renders to on behalf of the client. 2156 // The GL context this decoder renders to on behalf of the client.
2153 scoped_refptr<gl::GLSurface> surface_; 2157 scoped_refptr<gl::GLSurface> surface_;
2154 scoped_refptr<gl::GLContext> context_; 2158 scoped_refptr<gl::GLContext> context_;
2155 2159
2160 // WebVR data for switching and restoring the underlying destination surface.
2161 scoped_refptr<gl::GLSurface> webvr_surface_;
2162 scoped_refptr<gl::GLSurface> webvr_orig_surface_;
2163 std::unique_ptr<BackFramebuffer> webvr_orig_offscreen_target_frame_buffer_;
2164 bool webvr_orig_supports_async_swap_;
2165
2156 // The ContextGroup for this decoder uses to track resources. 2166 // The ContextGroup for this decoder uses to track resources.
2157 scoped_refptr<ContextGroup> group_; 2167 scoped_refptr<ContextGroup> group_;
2158 2168
2159 DebugMarkerManager debug_marker_manager_; 2169 DebugMarkerManager debug_marker_manager_;
2160 Logger logger_; 2170 Logger logger_;
2161 2171
2162 // All the state for this context. 2172 // All the state for this context.
2163 ContextState state_; 2173 ContextState state_;
2164 2174
2165 std::unique_ptr<TransformFeedbackManager> transform_feedback_manager_; 2175 std::unique_ptr<TransformFeedbackManager> transform_feedback_manager_;
(...skipping 14634 matching lines...) Expand 10 before | Expand all | Expand 10 after
16800 RestoreCurrentFramebufferBindings(); 16810 RestoreCurrentFramebufferBindings();
16801 if (LOCAL_PEEK_GL_ERROR("glApplyFramebufferAttachmentCMAAINTEL") != 16811 if (LOCAL_PEEK_GL_ERROR("glApplyFramebufferAttachmentCMAAINTEL") !=
16802 GL_NO_ERROR) 16812 GL_NO_ERROR)
16803 return; 16813 return;
16804 } 16814 }
16805 apply_framebuffer_attachment_cmaa_intel_ 16815 apply_framebuffer_attachment_cmaa_intel_
16806 ->ApplyFramebufferAttachmentCMAAINTEL(this, bound_framebuffer); 16816 ->ApplyFramebufferAttachmentCMAAINTEL(this, bound_framebuffer);
16807 } 16817 }
16808 } 16818 }
16809 16819
16820 void GLES2DecoderImpl::DoSetSurfaceHandleCHROMIUM(GLint surface_handle) {
bajones 2016/10/28 00:41:22 Looking at this implementation the function name i
bajones 2016/10/28 16:47:46 Oh, and I also realized last night that you're goi
klausw 2016/11/08 02:18:30 It no longer changes the framebuffer binding in th
klausw 2016/11/08 02:18:30 Done, and added an #else to raise a GL_INVALID_OPE
16821 if (surface_handle) {
16822 // Use the specified surface as a render target, saving the offscreen
16823 // render buffer so that we can restore it later.
16824
16825 // Ignore redundant calls. For now we don't support switching between
16826 // different surfaces, if you need this you have to make a call with
16827 // surface_handle=0 in between.
16828 if (webvr_surface_) return;
16829
16830 // One-time initialization when first activating WebVR surface.
16831 ANativeWindow* window =
16832 gpu::GpuSurfaceLookup::GetInstance()->AcquireNativeWidget(
16833 surface_handle);
16834 webvr_surface_ = new gl::NativeViewGLSurfaceEGL(window);
16835 // TODO(klausw): need to add a depth buffer for doing 3D rendering.
16836 // Currently it's just used for a 2D copy.
16837 bool initialize_success =
16838 webvr_surface_->Initialize(gl::GLSurface::SURFACE_ARGB8888);
16839 if (!initialize_success) {
16840 LOG(ERROR) << "WebVR surface init failed, handle=" << surface_handle;
16841 }
16842 ANativeWindow_release(window);
16843
16844 webvr_orig_surface_ = surface_;
16845
16846 // We don't want async swap since we want full control over when the
16847 // SurfaceTexture gets updated.
16848 webvr_orig_supports_async_swap_ = supports_async_swap_;
16849 supports_async_swap_ = false;
16850
16851 // Offscreen surfaces don't support SwapBuffers, make sure it's not
16852 // considered offscreen. Various code in this file checks for is_offscreen
16853 // = !!offscreen_target_frame_buffer_.get().
16854 webvr_orig_offscreen_target_frame_buffer_ =
16855 std::move(offscreen_target_frame_buffer_);
16856 offscreen_target_frame_buffer_.reset(nullptr);
16857
16858 // Activate the surface, and use it for rendering.
16859 SetSurface(webvr_surface_);
16860 glBindFramebufferEXT(GL_FRAMEBUFFER, 0);
16861 glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, 0);
16862 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, 0);
16863
16864 // TODO(klausw): is any additional cleanup needed in destructor, or
16865 // do smart pointers do the right thing already?
16866 } else {
16867 // Restore original state for drawing offscreen.
16868
16869 // Ignore redundant calls.
16870 if (!webvr_surface_) return;
16871
16872 // TODO(klausw): check if this is sufficient cleanup, I'm assuming that
16873 // clearing the smart pointer calls the appropriate destructor.
16874 webvr_surface_ = nullptr;
16875
16876 supports_async_swap_ = webvr_orig_supports_async_swap_;
16877
16878 offscreen_target_frame_buffer_ =
16879 std::move(webvr_orig_offscreen_target_frame_buffer_);
16880 webvr_orig_offscreen_target_frame_buffer_.reset(nullptr);
16881
16882 SetSurface(webvr_orig_surface_);
16883 }
16884 }
16885
16810 void GLES2DecoderImpl::DoInsertEventMarkerEXT( 16886 void GLES2DecoderImpl::DoInsertEventMarkerEXT(
16811 GLsizei length, const GLchar* marker) { 16887 GLsizei length, const GLchar* marker) {
16812 if (!marker) { 16888 if (!marker) {
16813 marker = ""; 16889 marker = "";
16814 } 16890 }
16815 debug_marker_manager_.SetMarker( 16891 debug_marker_manager_.SetMarker(
16816 length ? std::string(marker, length) : std::string(marker)); 16892 length ? std::string(marker, length) : std::string(marker));
16817 } 16893 }
16818 16894
16819 void GLES2DecoderImpl::DoPushGroupMarkerEXT( 16895 void GLES2DecoderImpl::DoPushGroupMarkerEXT(
(...skipping 1840 matching lines...) Expand 10 before | Expand all | Expand 10 after
18660 } 18736 }
18661 18737
18662 // Include the auto-generated part of this file. We split this because it means 18738 // Include the auto-generated part of this file. We split this because it means
18663 // we can easily edit the non-auto generated parts right here in this file 18739 // we can easily edit the non-auto generated parts right here in this file
18664 // instead of having to edit some template or the code generator. 18740 // instead of having to edit some template or the code generator.
18665 #include "base/macros.h" 18741 #include "base/macros.h"
18666 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" 18742 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h"
18667 18743
18668 } // namespace gles2 18744 } // namespace gles2
18669 } // namespace gpu 18745 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698