OLD | NEW |
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 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
121 // These values are for an IEEE single-precision floating-point format. | 121 // These values are for an IEEE single-precision floating-point format. |
122 range[0] = 127; | 122 range[0] = 127; |
123 range[1] = 127; | 123 range[1] = 127; |
124 *precision = 23; | 124 *precision = 23; |
125 break; | 125 break; |
126 default: | 126 default: |
127 NOTREACHED(); | 127 NOTREACHED(); |
128 break; | 128 break; |
129 } | 129 } |
130 | 130 |
131 if (gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2 && | 131 if (gl::GetGLImplementation() == gl::kGLImplementationEGLGLES2 && |
132 gfx::g_driver_gl.fn.glGetShaderPrecisionFormatFn) { | 132 gl::g_driver_gl.fn.glGetShaderPrecisionFormatFn) { |
133 // This function is sometimes defined even though it's really just | 133 // This function is sometimes defined even though it's really just |
134 // a stub, so we need to set range and precision as if it weren't | 134 // a stub, so we need to set range and precision as if it weren't |
135 // defined before calling it. | 135 // defined before calling it. |
136 // On Mac OS with some GPUs, calling this generates a | 136 // On Mac OS with some GPUs, calling this generates a |
137 // GL_INVALID_OPERATION error. Avoid calling it on non-GLES2 | 137 // GL_INVALID_OPERATION error. Avoid calling it on non-GLES2 |
138 // platforms. | 138 // platforms. |
139 glGetShaderPrecisionFormat(shader_type, precision_type, | 139 glGetShaderPrecisionFormat(shader_type, precision_type, |
140 range, precision); | 140 range, precision); |
141 | 141 |
142 // TODO(brianderson): Make the following official workarounds. | 142 // TODO(brianderson): Make the following official workarounds. |
(...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
508 return id_; | 508 return id_; |
509 } | 509 } |
510 | 510 |
511 private: | 511 private: |
512 GLES2DecoderImpl* decoder_; | 512 GLES2DecoderImpl* decoder_; |
513 GLuint id_; | 513 GLuint id_; |
514 DISALLOW_COPY_AND_ASSIGN(BackFramebuffer); | 514 DISALLOW_COPY_AND_ASSIGN(BackFramebuffer); |
515 }; | 515 }; |
516 | 516 |
517 struct FenceCallback { | 517 struct FenceCallback { |
518 FenceCallback() | 518 FenceCallback() : fence(gl::GLFence::Create()) { DCHECK(fence); } |
519 : fence(gfx::GLFence::Create()) { | |
520 DCHECK(fence); | |
521 } | |
522 std::vector<base::Closure> callbacks; | 519 std::vector<base::Closure> callbacks; |
523 std::unique_ptr<gfx::GLFence> fence; | 520 std::unique_ptr<gl::GLFence> fence; |
524 }; | 521 }; |
525 | 522 |
526 // } // anonymous namespace. | 523 // } // anonymous namespace. |
527 | 524 |
528 // static | 525 // static |
529 const unsigned int GLES2Decoder::kDefaultStencilMask = | 526 const unsigned int GLES2Decoder::kDefaultStencilMask = |
530 static_cast<unsigned int>(-1); | 527 static_cast<unsigned int>(-1); |
531 | 528 |
532 bool GLES2Decoder::GetServiceTextureId(uint32_t client_texture_id, | 529 bool GLES2Decoder::GetServiceTextureId(uint32_t client_texture_id, |
533 uint32_t* service_texture_id) { | 530 uint32_t* service_texture_id) { |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
573 template <bool DebugImpl> | 570 template <bool DebugImpl> |
574 error::Error DoCommandsImpl(unsigned int num_commands, | 571 error::Error DoCommandsImpl(unsigned int num_commands, |
575 const void* buffer, | 572 const void* buffer, |
576 int num_entries, | 573 int num_entries, |
577 int* entries_processed); | 574 int* entries_processed); |
578 | 575 |
579 // Overridden from AsyncAPIInterface. | 576 // Overridden from AsyncAPIInterface. |
580 const char* GetCommandName(unsigned int command_id) const override; | 577 const char* GetCommandName(unsigned int command_id) const override; |
581 | 578 |
582 // Overridden from GLES2Decoder. | 579 // Overridden from GLES2Decoder. |
583 bool Initialize(const scoped_refptr<gfx::GLSurface>& surface, | 580 bool Initialize(const scoped_refptr<gl::GLSurface>& surface, |
584 const scoped_refptr<gfx::GLContext>& context, | 581 const scoped_refptr<gl::GLContext>& context, |
585 bool offscreen, | 582 bool offscreen, |
586 const gfx::Size& offscreen_size, | 583 const gfx::Size& offscreen_size, |
587 const DisallowedFeatures& disallowed_features, | 584 const DisallowedFeatures& disallowed_features, |
588 const ContextCreationAttribHelper& attrib_helper) override; | 585 const ContextCreationAttribHelper& attrib_helper) override; |
589 void Destroy(bool have_context) override; | 586 void Destroy(bool have_context) override; |
590 void SetSurface(const scoped_refptr<gfx::GLSurface>& surface) override; | 587 void SetSurface(const scoped_refptr<gl::GLSurface>& surface) override; |
591 void ReleaseSurface() override; | 588 void ReleaseSurface() override; |
592 void TakeFrontBuffer(const Mailbox& mailbox) override; | 589 void TakeFrontBuffer(const Mailbox& mailbox) override; |
593 void ReturnFrontBuffer(const Mailbox& mailbox, bool is_lost) override; | 590 void ReturnFrontBuffer(const Mailbox& mailbox, bool is_lost) override; |
594 bool ResizeOffscreenFrameBuffer(const gfx::Size& size) override; | 591 bool ResizeOffscreenFrameBuffer(const gfx::Size& size) override; |
595 void UpdateParentTextureInfo(); | 592 void UpdateParentTextureInfo(); |
596 bool MakeCurrent() override; | 593 bool MakeCurrent() override; |
597 GLES2Util* GetGLES2Util() override { return &util_; } | 594 GLES2Util* GetGLES2Util() override { return &util_; } |
598 gfx::GLContext* GetGLContext() override { return context_.get(); } | 595 gl::GLContext* GetGLContext() override { return context_.get(); } |
599 ContextGroup* GetContextGroup() override { return group_.get(); } | 596 ContextGroup* GetContextGroup() override { return group_.get(); } |
600 Capabilities GetCapabilities() override; | 597 Capabilities GetCapabilities() override; |
601 void RestoreState(const ContextState* prev_state) override; | 598 void RestoreState(const ContextState* prev_state) override; |
602 | 599 |
603 void RestoreActiveTexture() const override { state_.RestoreActiveTexture(); } | 600 void RestoreActiveTexture() const override { state_.RestoreActiveTexture(); } |
604 void RestoreAllTextureUnitBindings( | 601 void RestoreAllTextureUnitBindings( |
605 const ContextState* prev_state) const override { | 602 const ContextState* prev_state) const override { |
606 state_.RestoreAllTextureUnitBindings(prev_state); | 603 state_.RestoreAllTextureUnitBindings(prev_state); |
607 } | 604 } |
608 void RestoreActiveTextureUnitBinding(unsigned int target) const override { | 605 void RestoreActiveTextureUnitBinding(unsigned int target) const override { |
(...skipping 1386 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1995 // Generate a member function prototype for each command in an automated and | 1992 // Generate a member function prototype for each command in an automated and |
1996 // typesafe way. | 1993 // typesafe way. |
1997 #define GLES2_CMD_OP(name) \ | 1994 #define GLES2_CMD_OP(name) \ |
1998 Error Handle##name(uint32_t immediate_data_size, const void* data); | 1995 Error Handle##name(uint32_t immediate_data_size, const void* data); |
1999 | 1996 |
2000 GLES2_COMMAND_LIST(GLES2_CMD_OP) | 1997 GLES2_COMMAND_LIST(GLES2_CMD_OP) |
2001 | 1998 |
2002 #undef GLES2_CMD_OP | 1999 #undef GLES2_CMD_OP |
2003 | 2000 |
2004 // The GL context this decoder renders to on behalf of the client. | 2001 // The GL context this decoder renders to on behalf of the client. |
2005 scoped_refptr<gfx::GLSurface> surface_; | 2002 scoped_refptr<gl::GLSurface> surface_; |
2006 scoped_refptr<gfx::GLContext> context_; | 2003 scoped_refptr<gl::GLContext> context_; |
2007 | 2004 |
2008 // The ContextGroup for this decoder uses to track resources. | 2005 // The ContextGroup for this decoder uses to track resources. |
2009 scoped_refptr<ContextGroup> group_; | 2006 scoped_refptr<ContextGroup> group_; |
2010 | 2007 |
2011 DebugMarkerManager debug_marker_manager_; | 2008 DebugMarkerManager debug_marker_manager_; |
2012 Logger logger_; | 2009 Logger logger_; |
2013 | 2010 |
2014 // All the state for this context. | 2011 // All the state for this context. |
2015 ContextState state_; | 2012 ContextState state_; |
2016 | 2013 |
(...skipping 731 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2748 validation_fbo_(0), | 2745 validation_fbo_(0), |
2749 texture_manager_service_id_generation_(0), | 2746 texture_manager_service_id_generation_(0), |
2750 force_shader_name_hashing_for_test(false) { | 2747 force_shader_name_hashing_for_test(false) { |
2751 DCHECK(group); | 2748 DCHECK(group); |
2752 } | 2749 } |
2753 | 2750 |
2754 GLES2DecoderImpl::~GLES2DecoderImpl() { | 2751 GLES2DecoderImpl::~GLES2DecoderImpl() { |
2755 } | 2752 } |
2756 | 2753 |
2757 bool GLES2DecoderImpl::Initialize( | 2754 bool GLES2DecoderImpl::Initialize( |
2758 const scoped_refptr<gfx::GLSurface>& surface, | 2755 const scoped_refptr<gl::GLSurface>& surface, |
2759 const scoped_refptr<gfx::GLContext>& context, | 2756 const scoped_refptr<gl::GLContext>& context, |
2760 bool offscreen, | 2757 bool offscreen, |
2761 const gfx::Size& offscreen_size, | 2758 const gfx::Size& offscreen_size, |
2762 const DisallowedFeatures& disallowed_features, | 2759 const DisallowedFeatures& disallowed_features, |
2763 const ContextCreationAttribHelper& attrib_helper) { | 2760 const ContextCreationAttribHelper& attrib_helper) { |
2764 TRACE_EVENT0("gpu", "GLES2DecoderImpl::Initialize"); | 2761 TRACE_EVENT0("gpu", "GLES2DecoderImpl::Initialize"); |
2765 DCHECK(context->IsCurrent(surface.get())); | 2762 DCHECK(context->IsCurrent(surface.get())); |
2766 DCHECK(!context_.get()); | 2763 DCHECK(!context_.get()); |
2767 DCHECK(!offscreen || !offscreen_size.IsEmpty()); | 2764 DCHECK(!offscreen || !offscreen_size.IsEmpty()); |
2768 | 2765 |
2769 surfaceless_ = surface->IsSurfaceless() && !offscreen; | 2766 surfaceless_ = surface->IsSurfaceless() && !offscreen; |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2923 // glGetIntegerv() throws a GL error, it leaves its argument unchanged. | 2920 // glGetIntegerv() throws a GL error, it leaves its argument unchanged. |
2924 GLint max_sample_count = 1; | 2921 GLint max_sample_count = 1; |
2925 glGetIntegerv(GL_MAX_SAMPLES_EXT, &max_sample_count); | 2922 glGetIntegerv(GL_MAX_SAMPLES_EXT, &max_sample_count); |
2926 offscreen_target_samples_ = std::min(attrib_helper.samples, | 2923 offscreen_target_samples_ = std::min(attrib_helper.samples, |
2927 max_sample_count); | 2924 max_sample_count); |
2928 } else { | 2925 } else { |
2929 offscreen_target_samples_ = 1; | 2926 offscreen_target_samples_ = 1; |
2930 } | 2927 } |
2931 offscreen_target_buffer_preserved_ = attrib_helper.buffer_preserved; | 2928 offscreen_target_buffer_preserved_ = attrib_helper.buffer_preserved; |
2932 | 2929 |
2933 if (gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2) { | 2930 if (gl::GetGLImplementation() == gl::kGLImplementationEGLGLES2) { |
2934 const bool rgb8_supported = | 2931 const bool rgb8_supported = |
2935 context_->HasExtension("GL_OES_rgb8_rgba8"); | 2932 context_->HasExtension("GL_OES_rgb8_rgba8"); |
2936 // The only available default render buffer formats in GLES2 have very | 2933 // The only available default render buffer formats in GLES2 have very |
2937 // little precision. Don't enable multisampling unless 8-bit render | 2934 // little precision. Don't enable multisampling unless 8-bit render |
2938 // buffer formats are available--instead fall back to 8-bit textures. | 2935 // buffer formats are available--instead fall back to 8-bit textures. |
2939 if (rgb8_supported && offscreen_target_samples_ > 1) { | 2936 if (rgb8_supported && offscreen_target_samples_ > 1) { |
2940 offscreen_target_color_format_ = attrib_helper.alpha_size > 0 ? | 2937 offscreen_target_color_format_ = attrib_helper.alpha_size > 0 ? |
2941 GL_RGBA8 : GL_RGB8; | 2938 GL_RGBA8 : GL_RGB8; |
2942 } else { | 2939 } else { |
2943 offscreen_target_samples_ = 1; | 2940 offscreen_target_samples_ = 1; |
(...skipping 1426 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4370 | 4367 |
4371 #if defined(OS_MACOSX) | 4368 #if defined(OS_MACOSX) |
4372 for (TextureToIOSurfaceMap::iterator it = texture_to_io_surface_map_.begin(); | 4369 for (TextureToIOSurfaceMap::iterator it = texture_to_io_surface_map_.begin(); |
4373 it != texture_to_io_surface_map_.end(); ++it) { | 4370 it != texture_to_io_surface_map_.end(); ++it) { |
4374 CFRelease(it->second); | 4371 CFRelease(it->second); |
4375 } | 4372 } |
4376 texture_to_io_surface_map_.clear(); | 4373 texture_to_io_surface_map_.clear(); |
4377 #endif | 4374 #endif |
4378 } | 4375 } |
4379 | 4376 |
4380 void GLES2DecoderImpl::SetSurface( | 4377 void GLES2DecoderImpl::SetSurface(const scoped_refptr<gl::GLSurface>& surface) { |
4381 const scoped_refptr<gfx::GLSurface>& surface) { | |
4382 DCHECK(context_->IsCurrent(NULL)); | 4378 DCHECK(context_->IsCurrent(NULL)); |
4383 DCHECK(surface); | 4379 DCHECK(surface); |
4384 surface_ = surface; | 4380 surface_ = surface; |
4385 RestoreCurrentFramebufferBindings(); | 4381 RestoreCurrentFramebufferBindings(); |
4386 } | 4382 } |
4387 | 4383 |
4388 void GLES2DecoderImpl::ReleaseSurface() { | 4384 void GLES2DecoderImpl::ReleaseSurface() { |
4389 if (!context_.get()) | 4385 if (!context_.get()) |
4390 return; | 4386 return; |
4391 if (WasContextLost()) { | 4387 if (WasContextLost()) { |
(...skipping 1269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5661 (feature_info_->context_type() == CONTEXT_TYPE_WEBGL1 || | 5657 (feature_info_->context_type() == CONTEXT_TYPE_WEBGL1 || |
5662 feature_info_->context_type() == CONTEXT_TYPE_OPENGLES2)) { | 5658 feature_info_->context_type() == CONTEXT_TYPE_OPENGLES2)) { |
5663 *params = GL_HALF_FLOAT_OES; | 5659 *params = GL_HALF_FLOAT_OES; |
5664 } | 5660 } |
5665 } | 5661 } |
5666 return true; | 5662 return true; |
5667 default: | 5663 default: |
5668 break; | 5664 break; |
5669 } | 5665 } |
5670 | 5666 |
5671 if (gfx::GetGLImplementation() != gfx::kGLImplementationEGLGLES2) { | 5667 if (gl::GetGLImplementation() != gl::kGLImplementationEGLGLES2) { |
5672 switch (pname) { | 5668 switch (pname) { |
5673 case GL_MAX_FRAGMENT_UNIFORM_VECTORS: | 5669 case GL_MAX_FRAGMENT_UNIFORM_VECTORS: |
5674 *num_written = 1; | 5670 *num_written = 1; |
5675 if (params) { | 5671 if (params) { |
5676 *params = group_->max_fragment_uniform_vectors(); | 5672 *params = group_->max_fragment_uniform_vectors(); |
5677 } | 5673 } |
5678 return true; | 5674 return true; |
5679 case GL_MAX_VARYING_VECTORS: | 5675 case GL_MAX_VARYING_VECTORS: |
5680 *num_written = 1; | 5676 *num_written = 1; |
5681 if (params) { | 5677 if (params) { |
(...skipping 7462 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13144 // TODO(gman): call glShaderBinary | 13140 // TODO(gman): call glShaderBinary |
13145 return error::kNoError; | 13141 return error::kNoError; |
13146 #endif | 13142 #endif |
13147 } | 13143 } |
13148 | 13144 |
13149 void GLES2DecoderImpl::DoSwapBuffers() { | 13145 void GLES2DecoderImpl::DoSwapBuffers() { |
13150 bool is_offscreen = !!offscreen_target_frame_buffer_.get(); | 13146 bool is_offscreen = !!offscreen_target_frame_buffer_.get(); |
13151 | 13147 |
13152 int this_frame_number = frame_number_++; | 13148 int this_frame_number = frame_number_++; |
13153 // TRACE_EVENT for gpu tests: | 13149 // TRACE_EVENT for gpu tests: |
13154 TRACE_EVENT_INSTANT2("test_gpu", "SwapBuffersLatency", | 13150 TRACE_EVENT_INSTANT2( |
13155 TRACE_EVENT_SCOPE_THREAD, | 13151 "test_gpu", "SwapBuffersLatency", TRACE_EVENT_SCOPE_THREAD, "GLImpl", |
13156 "GLImpl", static_cast<int>(gfx::GetGLImplementation()), | 13152 static_cast<int>(gl::GetGLImplementation()), "width", |
13157 "width", (is_offscreen ? offscreen_size_.width() : | 13153 (is_offscreen ? offscreen_size_.width() : surface_->GetSize().width())); |
13158 surface_->GetSize().width())); | |
13159 TRACE_EVENT2("gpu", "GLES2DecoderImpl::DoSwapBuffers", | 13154 TRACE_EVENT2("gpu", "GLES2DecoderImpl::DoSwapBuffers", |
13160 "offscreen", is_offscreen, | 13155 "offscreen", is_offscreen, |
13161 "frame", this_frame_number); | 13156 "frame", this_frame_number); |
13162 { | 13157 { |
13163 TRACE_EVENT_SYNTHETIC_DELAY("gpu.PresentingFrame"); | 13158 TRACE_EVENT_SYNTHETIC_DELAY("gpu.PresentingFrame"); |
13164 } | 13159 } |
13165 | 13160 |
13166 ScopedGPUTrace scoped_gpu_trace(gpu_tracer_.get(), kTraceDecoder, | 13161 ScopedGPUTrace scoped_gpu_trace(gpu_tracer_.get(), kTraceDecoder, |
13167 "GLES2Decoder", "SwapBuffer"); | 13162 "GLES2Decoder", "SwapBuffer"); |
13168 | 13163 |
(...skipping 907 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14076 CFRelease(surface); | 14071 CFRelease(surface); |
14077 texture_to_io_surface_map_.erase(it); | 14072 texture_to_io_surface_map_.erase(it); |
14078 } | 14073 } |
14079 } | 14074 } |
14080 #endif | 14075 #endif |
14081 | 14076 |
14082 void GLES2DecoderImpl::DoTexImageIOSurface2DCHROMIUM( | 14077 void GLES2DecoderImpl::DoTexImageIOSurface2DCHROMIUM( |
14083 GLenum target, GLsizei width, GLsizei height, | 14078 GLenum target, GLsizei width, GLsizei height, |
14084 GLuint io_surface_id, GLuint plane) { | 14079 GLuint io_surface_id, GLuint plane) { |
14085 #if defined(OS_MACOSX) | 14080 #if defined(OS_MACOSX) |
14086 if (gfx::GetGLImplementation() != gfx::kGLImplementationDesktopGL) { | 14081 if (gl::GetGLImplementation() != gl::kGLImplementationDesktopGL) { |
14087 LOCAL_SET_GL_ERROR( | 14082 LOCAL_SET_GL_ERROR( |
14088 GL_INVALID_OPERATION, | 14083 GL_INVALID_OPERATION, |
14089 "glTexImageIOSurface2DCHROMIUM", "only supported on desktop GL."); | 14084 "glTexImageIOSurface2DCHROMIUM", "only supported on desktop GL."); |
14090 return; | 14085 return; |
14091 } | 14086 } |
14092 | 14087 |
14093 if (target != GL_TEXTURE_RECTANGLE_ARB) { | 14088 if (target != GL_TEXTURE_RECTANGLE_ARB) { |
14094 // This might be supported in the future, and if we could require | 14089 // This might be supported in the future, and if we could require |
14095 // support for binding an IOSurface to a NPOT TEXTURE_2D texture, we | 14090 // support for binding an IOSurface to a NPOT TEXTURE_2D texture, we |
14096 // could delete a lot of code. For now, perform strict validation so we | 14091 // could delete a lot of code. For now, perform strict validation so we |
(...skipping 2733 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16830 } | 16825 } |
16831 | 16826 |
16832 // Include the auto-generated part of this file. We split this because it means | 16827 // Include the auto-generated part of this file. We split this because it means |
16833 // we can easily edit the non-auto generated parts right here in this file | 16828 // we can easily edit the non-auto generated parts right here in this file |
16834 // instead of having to edit some template or the code generator. | 16829 // instead of having to edit some template or the code generator. |
16835 #include "base/macros.h" | 16830 #include "base/macros.h" |
16836 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 16831 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
16837 | 16832 |
16838 } // namespace gles2 | 16833 } // namespace gles2 |
16839 } // namespace gpu | 16834 } // namespace gpu |
OLD | NEW |