Index: src/gpu/gl/SkNullGLContext.cpp |
diff --git a/src/gpu/gl/SkNullGLContext.cpp b/src/gpu/gl/SkNullGLContext.cpp |
index 2bc417df92bc4be233d690127a4f843f9a3f4595..42dafc5dee0631c39ce772a0667cea6ac460a7b6 100644 |
--- a/src/gpu/gl/SkNullGLContext.cpp |
+++ b/src/gpu/gl/SkNullGLContext.cpp |
@@ -13,7 +13,7 @@ |
#include "SkTDArray.h" |
#include "SkTLS.h" |
-static const SkNullGLContext* current_context(); |
+static SkNullGLContext::ContextState* current_context(); |
///////////////////////////////////////////////////////////////////////////////////////////////// |
@@ -115,7 +115,7 @@ private: |
/** |
* The state object for the null interface. |
*/ |
-struct SkNullGLContext::ContextState { |
+class SkNullGLContext::ContextState : public SkRefCnt { |
public: |
SK_DECLARE_INST_COUNT(ContextState); |
@@ -132,11 +132,7 @@ public: |
, fCurrProgramID(0) |
, fCurrShaderID(0) {} |
- static ContextState* Get() { |
- const SkNullGLContext* context = current_context(); |
- SkASSERT(context); |
- return context->fState; |
- } |
+ static ContextState* Get() { return current_context(); } |
}; |
typedef SkNullGLContext::ContextState State; |
@@ -338,10 +334,19 @@ GrGLvoid GR_GL_FUNCTION_TYPE nullGLGetBufferParameteriv(GrGLenum target, GrGLenu |
} |
}; |
+class NullInterface : public GrGLInterface { |
+public: |
+ NullInterface(State* state) : fState(SkRef(state)) {} |
+ ~NullInterface() SK_OVERRIDE { |
+ fState->unref(); |
+ } |
+ State* fState; |
+}; |
+ |
} // end anonymous namespace |
-static const GrGLInterface* create_null_interface() { |
- GrGLInterface* interface = SkNEW(GrGLInterface); |
+static GrGLInterface* create_null_interface(State* state) { |
+ GrGLInterface* interface = SkNEW_ARGS(NullInterface, (state)); |
interface->fStandard = kGL_GrGLStandard; |
@@ -489,35 +494,40 @@ static const GrGLInterface* create_null_interface() { |
////////////////////////////////////////////////////////////////////////////// |
static void* create_tls() { |
- const SkNullGLContext** current = SkNEW(const SkNullGLContext*); |
+ State** current = SkNEW(State*); |
*current = NULL; |
return current; |
} |
static void delete_tls(void* ctx) { |
- const SkNullGLContext** current = static_cast<const SkNullGLContext**>(ctx); |
+ State** current = static_cast<State**>(ctx); |
if (*current) { |
(*current)->unref(); |
} |
SkDELETE(current); |
} |
-static const SkNullGLContext* current_context() { |
- return *static_cast<const SkNullGLContext**>(SkTLS::Get(create_tls, delete_tls)); |
+static State* current_context() { |
+ return *static_cast<State**>(SkTLS::Get(create_tls, delete_tls)); |
} |
-static void set_current_context(const SkNullGLContext* context) { |
- const SkNullGLContext** current = |
- static_cast<const SkNullGLContext**>(SkTLS::Get(create_tls, delete_tls)); |
+static void set_current_context(State* state) { |
+ State** current = static_cast<State**>(SkTLS::Get(create_tls, delete_tls)); |
if (*current) { |
(*current)->unref(); |
} |
- *current = context; |
- if (context) { |
- context->ref(); |
+ *current = state; |
+ if (state) { |
+ state->ref(); |
} |
} |
+#if GR_GL_PER_GL_FUNC_CALLBACK |
+static void set_current_context_from_interface(const GrGLInterface* interface) { |
+ set_current_context(reinterpret_cast<State*>(interface->fCallbackData)); |
+} |
+#endif |
+ |
SkNullGLContext* SkNullGLContext::Create(GrGLStandard forcedGpuAPI) { |
if (kGLES_GrGLStandard == forcedGpuAPI) { |
return NULL; |
@@ -531,13 +541,18 @@ SkNullGLContext* SkNullGLContext::Create(GrGLStandard forcedGpuAPI) { |
} |
SkNullGLContext::SkNullGLContext() { |
- fGL.reset(create_null_interface()); |
fState = SkNEW(ContextState); |
+ GrGLInterface* interface = create_null_interface(fState); |
+ fGL.reset(interface); |
+#if GR_GL_PER_GL_FUNC_CALLBACK |
+ interface->fCallback = set_current_context_from_interface; |
+ interface->fCallbackData = reinterpret_cast<GrGLInterfaceCallbackData>(fState); |
+#endif |
} |
SkNullGLContext::~SkNullGLContext() { |
fGL.reset(NULL); |
- SkDELETE(fState); |
+ fState->unref(); |
} |
-void SkNullGLContext::makeCurrent() const { set_current_context(this); } |
+void SkNullGLContext::makeCurrent() const { set_current_context(fState); } |