| // Copyright 2015 Google Inc. All Rights Reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #ifndef COBALT_RENDERER_BACKEND_EGL_RESOURCE_CONTEXT_H_ |
| #define COBALT_RENDERER_BACKEND_EGL_RESOURCE_CONTEXT_H_ |
| |
| #include <EGL/egl.h> |
| |
| #include "base/callback.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "base/synchronization/lock.h" |
| #include "base/threading/thread.h" |
| |
| namespace cobalt { |
| namespace renderer { |
| namespace backend { |
| |
| class TextureData; |
| class RawTextureMemory; |
| |
| // The ResourceContext class encapsulates a GL context and a private thread |
| // upon which that GL context is always current. The GL context is associated |
| // with a dummy surface. The GL context will be shared with all other contexts |
| // created by the GraphicsSystem that owns this ResourceContext. This class |
| // is useful when one wishes to create and allocate pixel buffer data (e.g. for |
| // a texture) from any thread, that can later be converted to a texture for |
| // a specific grpahics context. Resource management GL operations can be |
| // performed (from any thread) by calling the method |
| // RunSynchronouslyWithinResourceContext() and passing a function which one |
| // wishes to run under the resource management GL context. |
| class ResourceContext { |
| public: |
| ResourceContext(EGLDisplay display, EGLConfig config); |
| ~ResourceContext(); |
| |
| EGLContext context() const { return context_; } |
| |
| // This method can be used to execute a function on the resource context |
| // thread, under which it can be assumed that the resource context is |
| // current. |
| void RunSynchronouslyWithinResourceContext(const base::Closure& function); |
| |
| // When called, asserts that the current thread is the resource context |
| // thread, which is the only thread which has the resource context current. |
| void AssertWithinResourceContext(); |
| |
| private: |
| // Called once upon construction on the resource context thread. |
| void MakeCurrent(); |
| |
| // Releases the current context from the resource context thread, and then |
| // destroys the resource context (and dummy surface). This is intended to |
| // be called from the destructor. |
| void ShutdownOnResourceThread(); |
| |
| EGLDisplay display_; |
| |
| // The EGL/OpenGL ES context hosted by this GraphicsContextEGL object. |
| EGLContext context_; |
| EGLConfig config_; |
| |
| // Since this context will be used only for resource management, it will |
| // not need an output surface associated with it. We create a dummy surface |
| // to satisfy EGL requirements. |
| EGLSurface null_surface_; |
| |
| // A private thread on which all resource management GL operations can be |
| // performed. The resource context will always be current on this thread. |
| base::Thread thread_; |
| |
| friend class ScopedMakeCurrent; |
| }; |
| |
| } // namespace backend |
| } // namespace renderer |
| } // namespace cobalt |
| |
| #endif // COBALT_RENDERER_BACKEND_EGL_RESOURCE_CONTEXT_H_ |