Commit c16f8dcd authored by CodeByThePound's avatar CodeByThePound Committed by Commit bot

Add ContextProvider::InvalidateGrContext to reset GL state in GrContext

If rendering code that is shared with GrContext changes any GL state,
then skia caches need to be notified.  This adds InvalidateGrContext()
method that will call private pure virtual method.  InvalidateGrContext
default argument will clear all state in GrContext.

Updated classes that derive from ContextProvider.

R=piman@chromium.org
BUG=

Review URL: https://codereview.chromium.org/1131723002

Cr-Commit-Position: refs/heads/master@{#329255}
parent c21dedb0
...@@ -142,6 +142,13 @@ class GrContext* AwRenderThreadContextProvider::GrContext() { ...@@ -142,6 +142,13 @@ class GrContext* AwRenderThreadContextProvider::GrContext() {
return gr_context_.get(); return gr_context_.get();
} }
void AwRenderThreadContextProvider::InvalidateGrContext(uint32_t state) {
DCHECK(main_thread_checker_.CalledOnValidThread());
if (gr_context_)
gr_context_.get()->resetContext(state);
}
void AwRenderThreadContextProvider::SetupLock() { void AwRenderThreadContextProvider::SetupLock() {
context_->SetLock(&context_lock_); context_->SetLock(&context_lock_);
} }
......
...@@ -41,6 +41,7 @@ class AwRenderThreadContextProvider : public cc::ContextProvider { ...@@ -41,6 +41,7 @@ class AwRenderThreadContextProvider : public cc::ContextProvider {
gpu::gles2::GLES2Interface* ContextGL() override; gpu::gles2::GLES2Interface* ContextGL() override;
gpu::ContextSupport* ContextSupport() override; gpu::ContextSupport* ContextSupport() override;
class GrContext* GrContext() override; class GrContext* GrContext() override;
void InvalidateGrContext(uint32_t state) override;
void SetupLock() override; void SetupLock() override;
base::Lock* GetLock() override; base::Lock* GetLock() override;
bool IsContextLost() override; bool IsContextLost() override;
......
...@@ -44,6 +44,10 @@ class ContextProvider : public base::RefCountedThreadSafe<ContextProvider> { ...@@ -44,6 +44,10 @@ class ContextProvider : public base::RefCountedThreadSafe<ContextProvider> {
CC_EXPORT Capabilities(); CC_EXPORT Capabilities();
}; };
// Invalidates the cached OpenGL state in GrContext.
// See skia GrContext::resetContext for details.
virtual void InvalidateGrContext(uint32_t state) = 0;
// Sets up a lock so this context can be used from multiple threads. // Sets up a lock so this context can be used from multiple threads.
virtual void SetupLock() = 0; virtual void SetupLock() = 0;
......
...@@ -90,6 +90,10 @@ class PerfContextProvider : public ContextProvider { ...@@ -90,6 +90,10 @@ class PerfContextProvider : public ContextProvider {
reinterpret_cast<GrBackendContext>(null_interface.get()))); reinterpret_cast<GrBackendContext>(null_interface.get())));
return gr_context_.get(); return gr_context_.get();
} }
void InvalidateGrContext(uint32_t state) override {
if (gr_context_)
gr_context_.get()->resetContext(state);
}
void SetupLock() override {} void SetupLock() override {}
base::Lock* GetLock() override { return &context_lock_; } base::Lock* GetLock() override { return &context_lock_; }
bool IsContextLost() override { return false; } bool IsContextLost() override { return false; }
......
...@@ -112,6 +112,14 @@ class GrContext* TestContextProvider::GrContext() { ...@@ -112,6 +112,14 @@ class GrContext* TestContextProvider::GrContext() {
return gr_context_.get(); return gr_context_.get();
} }
void TestContextProvider::InvalidateGrContext(uint32_t state) {
DCHECK(bound_);
DCHECK(context_thread_checker_.CalledOnValidThread());
if (gr_context_)
gr_context_.get()->resetContext(state);
}
void TestContextProvider::SetupLock() { void TestContextProvider::SetupLock() {
} }
......
...@@ -34,6 +34,7 @@ class TestContextProvider : public ContextProvider { ...@@ -34,6 +34,7 @@ class TestContextProvider : public ContextProvider {
gpu::gles2::GLES2Interface* ContextGL() override; gpu::gles2::GLES2Interface* ContextGL() override;
gpu::ContextSupport* ContextSupport() override; gpu::ContextSupport* ContextSupport() override;
class GrContext* GrContext() override; class GrContext* GrContext() override;
void InvalidateGrContext(uint32_t state) override;
void SetupLock() override; void SetupLock() override;
base::Lock* GetLock() override; base::Lock* GetLock() override;
bool IsContextLost() override; bool IsContextLost() override;
......
...@@ -124,6 +124,11 @@ class GrContext* TestInProcessContextProvider::GrContext() { ...@@ -124,6 +124,11 @@ class GrContext* TestInProcessContextProvider::GrContext() {
return gr_context_.get(); return gr_context_.get();
} }
void TestInProcessContextProvider::InvalidateGrContext(uint32_t state) {
if (gr_context_)
gr_context_.get()->resetContext(state);
}
void TestInProcessContextProvider::SetupLock() { void TestInProcessContextProvider::SetupLock() {
} }
......
...@@ -32,6 +32,7 @@ class TestInProcessContextProvider : public ContextProvider { ...@@ -32,6 +32,7 @@ class TestInProcessContextProvider : public ContextProvider {
gpu::gles2::GLES2Interface* ContextGL() override; gpu::gles2::GLES2Interface* ContextGL() override;
gpu::ContextSupport* ContextSupport() override; gpu::ContextSupport* ContextSupport() override;
class GrContext* GrContext() override; class GrContext* GrContext() override;
void InvalidateGrContext(uint32_t state) override;
void SetupLock() override; void SetupLock() override;
base::Lock* GetLock() override; base::Lock* GetLock() override;
Capabilities ContextCapabilities() override; Capabilities ContextCapabilities() override;
......
...@@ -43,6 +43,9 @@ class GrContext* ContextProviderMojo::GrContext() { ...@@ -43,6 +43,9 @@ class GrContext* ContextProviderMojo::GrContext() {
return NULL; return NULL;
} }
void ContextProviderMojo::InvalidateGrContext(uint32_t state) {
}
cc::ContextProvider::Capabilities ContextProviderMojo::ContextCapabilities() { cc::ContextProvider::Capabilities ContextProviderMojo::ContextCapabilities() {
return capabilities_; return capabilities_;
} }
......
...@@ -22,6 +22,7 @@ class ContextProviderMojo : public cc::ContextProvider { ...@@ -22,6 +22,7 @@ class ContextProviderMojo : public cc::ContextProvider {
gpu::gles2::GLES2Interface* ContextGL() override; gpu::gles2::GLES2Interface* ContextGL() override;
gpu::ContextSupport* ContextSupport() override; gpu::ContextSupport* ContextSupport() override;
class GrContext* GrContext() override; class GrContext* GrContext() override;
void InvalidateGrContext(uint32_t state) override;
Capabilities ContextCapabilities() override; Capabilities ContextCapabilities() override;
bool IsContextLost() override; bool IsContextLost() override;
void VerifyContexts() override {} void VerifyContexts() override {}
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "content/common/gpu/client/grcontext_for_webgraphicscontext3d.h" #include "content/common/gpu/client/grcontext_for_webgraphicscontext3d.h"
#include "gpu/blink/webgraphicscontext3d_in_process_command_buffer_impl.h" #include "gpu/blink/webgraphicscontext3d_in_process_command_buffer_impl.h"
#include "gpu/command_buffer/client/gles2_implementation.h" #include "gpu/command_buffer/client/gles2_implementation.h"
#include "third_party/skia/include/gpu/GrContext.h"
using gpu_blink::WebGraphicsContext3DInProcessCommandBufferImpl; using gpu_blink::WebGraphicsContext3DInProcessCommandBufferImpl;
...@@ -159,6 +160,14 @@ class GrContext* ContextProviderInProcess::GrContext() { ...@@ -159,6 +160,14 @@ class GrContext* ContextProviderInProcess::GrContext() {
return gr_context_->get(); return gr_context_->get();
} }
void ContextProviderInProcess::InvalidateGrContext(uint32_t state) {
DCHECK(lost_context_callback_proxy_); // Is bound to thread.
DCHECK(context_thread_checker_.CalledOnValidThread());
if (gr_context_)
return gr_context_->get()->resetContext(state);
}
void ContextProviderInProcess::SetupLock() { void ContextProviderInProcess::SetupLock() {
context3d_->SetLock(&context_lock_); context3d_->SetLock(&context_lock_);
} }
......
...@@ -52,6 +52,7 @@ class ContextProviderInProcess ...@@ -52,6 +52,7 @@ class ContextProviderInProcess
::gpu::gles2::GLES2Interface* ContextGL() override; ::gpu::gles2::GLES2Interface* ContextGL() override;
::gpu::ContextSupport* ContextSupport() override; ::gpu::ContextSupport* ContextSupport() override;
class GrContext* GrContext() override; class GrContext* GrContext() override;
void InvalidateGrContext(uint32_t state) override;
void SetupLock() override; void SetupLock() override;
base::Lock* GetLock() override; base::Lock* GetLock() override;
bool IsContextLost() override; bool IsContextLost() override;
......
...@@ -143,6 +143,14 @@ class GrContext* ContextProviderCommandBuffer::GrContext() { ...@@ -143,6 +143,14 @@ class GrContext* ContextProviderCommandBuffer::GrContext() {
return gr_context_->get(); return gr_context_->get();
} }
void ContextProviderCommandBuffer::InvalidateGrContext(uint32_t state) {
if (gr_context_) {
DCHECK(lost_context_callback_proxy_); // Is bound to thread.
DCHECK(context_thread_checker_.CalledOnValidThread());
gr_context_->get()->resetContext(state);
}
}
void ContextProviderCommandBuffer::SetupLock() { void ContextProviderCommandBuffer::SetupLock() {
DCHECK(context3d_); DCHECK(context3d_);
context3d_->GetCommandBufferProxy()->SetLock(&context_lock_); context3d_->GetCommandBufferProxy()->SetLock(&context_lock_);
......
...@@ -39,6 +39,7 @@ class CONTENT_EXPORT ContextProviderCommandBuffer ...@@ -39,6 +39,7 @@ class CONTENT_EXPORT ContextProviderCommandBuffer
gpu::gles2::GLES2Interface* ContextGL() override; gpu::gles2::GLES2Interface* ContextGL() override;
gpu::ContextSupport* ContextSupport() override; gpu::ContextSupport* ContextSupport() override;
class GrContext* GrContext() override; class GrContext* GrContext() override;
void InvalidateGrContext(uint32_t state) override;
void SetupLock() override; void SetupLock() override;
base::Lock* GetLock() override; base::Lock* GetLock() override;
Capabilities ContextCapabilities() override; Capabilities ContextCapabilities() override;
......
...@@ -39,6 +39,9 @@ gpu::ContextSupport* ContextProviderMojo::ContextSupport() { ...@@ -39,6 +39,9 @@ gpu::ContextSupport* ContextProviderMojo::ContextSupport() {
class GrContext* ContextProviderMojo::GrContext() { return NULL; } class GrContext* ContextProviderMojo::GrContext() { return NULL; }
void ContextProviderMojo::InvalidateGrContext(uint32_t state) {
}
cc::ContextProvider::Capabilities ContextProviderMojo::ContextCapabilities() { cc::ContextProvider::Capabilities ContextProviderMojo::ContextCapabilities() {
return capabilities_; return capabilities_;
} }
......
...@@ -23,6 +23,7 @@ class ContextProviderMojo : public cc::ContextProvider { ...@@ -23,6 +23,7 @@ class ContextProviderMojo : public cc::ContextProvider {
gpu::gles2::GLES2Interface* ContextGL() override; gpu::gles2::GLES2Interface* ContextGL() override;
gpu::ContextSupport* ContextSupport() override; gpu::ContextSupport* ContextSupport() override;
class GrContext* GrContext() override; class GrContext* GrContext() override;
void InvalidateGrContext(uint32_t state) override;
void SetupLock() override; void SetupLock() override;
base::Lock* GetLock() override; base::Lock* GetLock() override;
Capabilities ContextCapabilities() override; Capabilities ContextCapabilities() override;
......
...@@ -165,6 +165,13 @@ class GrContext* InProcessContextProvider::GrContext() { ...@@ -165,6 +165,13 @@ class GrContext* InProcessContextProvider::GrContext() {
return gr_context_.get(); return gr_context_.get();
} }
void InProcessContextProvider::InvalidateGrContext(uint32_t state) {
DCHECK(context_thread_checker_.CalledOnValidThread());
if (gr_context_)
gr_context_.get()->resetContext(state);
}
void InProcessContextProvider::SetupLock() { void InProcessContextProvider::SetupLock() {
} }
......
...@@ -48,6 +48,7 @@ class InProcessContextProvider : public cc::ContextProvider { ...@@ -48,6 +48,7 @@ class InProcessContextProvider : public cc::ContextProvider {
gpu::gles2::GLES2Interface* ContextGL() override; gpu::gles2::GLES2Interface* ContextGL() override;
gpu::ContextSupport* ContextSupport() override; gpu::ContextSupport* ContextSupport() override;
class GrContext* GrContext() override; class GrContext* GrContext() override;
void InvalidateGrContext(uint32_t state) override;
void SetupLock() override; void SetupLock() override;
base::Lock* GetLock() override; base::Lock* GetLock() override;
bool IsContextLost() override; bool IsContextLost() override;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment