Index: src/gpu/gl/GrGpuGL_program.cpp |
diff --git a/src/gpu/gl/GrGpuGL_program.cpp b/src/gpu/gl/GrGpuGL_program.cpp |
index a1259c9bf8bc240f842828aade7bbb1e4e8deb8f..23de7a8599ae5c41b55089878cf925dfcf8b6281 100644 |
--- a/src/gpu/gl/GrGpuGL_program.cpp |
+++ b/src/gpu/gl/GrGpuGL_program.cpp |
@@ -31,14 +31,14 @@ struct GrGpuGL::ProgramCache::Entry { |
}; |
struct GrGpuGL::ProgramCache::ProgDescLess { |
- bool operator() (const GrGLProgramDesc& desc, const Entry* entry) { |
+ bool operator() (const GrProgramDesc& desc, const Entry* entry) { |
SkASSERT(entry->fProgram.get()); |
- return GrGLProgramDesc::Less(desc, entry->fProgram->getDesc()); |
+ return GrProgramDesc::Less(desc, entry->fProgram->getDesc()); |
} |
- bool operator() (const Entry* entry, const GrGLProgramDesc& desc) { |
+ bool operator() (const Entry* entry, const GrProgramDesc& desc) { |
SkASSERT(entry->fProgram.get()); |
- return GrGLProgramDesc::Less(entry->fProgram->getDesc(), desc); |
+ return GrProgramDesc::Less(entry->fProgram->getDesc(), desc); |
} |
}; |
@@ -86,35 +86,33 @@ void GrGpuGL::ProgramCache::abandon() { |
fCount = 0; |
} |
-int GrGpuGL::ProgramCache::search(const GrGLProgramDesc& desc) const { |
+int GrGpuGL::ProgramCache::search(const GrProgramDesc& desc) const { |
ProgDescLess less; |
return SkTSearch(fEntries, fCount, desc, sizeof(Entry*), less); |
} |
-GrGLProgram* GrGpuGL::ProgramCache::getProgram(const GrOptDrawState& optState, |
- const GrGLProgramDesc& desc, |
- DrawType type) { |
+GrGLProgram* GrGpuGL::ProgramCache::getProgram(const GrOptDrawState& optState, DrawType type) { |
#ifdef PROGRAM_CACHE_STATS |
++fTotalRequests; |
#endif |
Entry* entry = NULL; |
- uint32_t hashIdx = desc.getChecksum(); |
+ uint32_t hashIdx = optState.programDesc().getChecksum(); |
hashIdx ^= hashIdx >> 16; |
if (kHashBits <= 8) { |
hashIdx ^= hashIdx >> 8; |
} |
hashIdx &=((1 << kHashBits) - 1); |
Entry* hashedEntry = fHashTable[hashIdx]; |
- if (hashedEntry && hashedEntry->fProgram->getDesc() == desc) { |
+ if (hashedEntry && hashedEntry->fProgram->getDesc() == optState.programDesc()) { |
SkASSERT(hashedEntry->fProgram); |
entry = hashedEntry; |
} |
int entryIdx; |
if (NULL == entry) { |
- entryIdx = this->search(desc); |
+ entryIdx = this->search(optState.programDesc()); |
if (entryIdx >= 0) { |
entry = fEntries[entryIdx]; |
#ifdef PROGRAM_CACHE_STATS |
@@ -128,7 +126,7 @@ GrGLProgram* GrGpuGL::ProgramCache::getProgram(const GrOptDrawState& optState, |
#ifdef PROGRAM_CACHE_STATS |
++fCacheMisses; |
#endif |
- GrGLProgram* program = GrGLProgramBuilder::CreateProgram(optState, desc, type, fGpu); |
+ GrGLProgram* program = GrGLProgramBuilder::CreateProgram(optState, type, fGpu); |
if (NULL == program) { |
return NULL; |
} |
@@ -178,10 +176,10 @@ GrGLProgram* GrGpuGL::ProgramCache::getProgram(const GrOptDrawState& optState, |
SkASSERT(fEntries[0]->fProgram.get()); |
for (int i = 0; i < fCount - 1; ++i) { |
SkASSERT(fEntries[i + 1]->fProgram.get()); |
- const GrGLProgramDesc& a = fEntries[i]->fProgram->getDesc(); |
- const GrGLProgramDesc& b = fEntries[i + 1]->fProgram->getDesc(); |
- SkASSERT(GrGLProgramDesc::Less(a, b)); |
- SkASSERT(!GrGLProgramDesc::Less(b, a)); |
+ const GrProgramDesc& a = fEntries[i]->fProgram->getDesc(); |
+ const GrProgramDesc& b = fEntries[i + 1]->fProgram->getDesc(); |
+ SkASSERT(GrProgramDesc::Less(a, b)); |
+ SkASSERT(!GrProgramDesc::Less(b, a)); |
} |
#endif |
} |
@@ -207,7 +205,8 @@ bool GrGpuGL::flushGraphicsState(DrawType type, |
const ScissorState& scissorState, |
const GrDeviceCoordTexture* dstCopy) { |
SkAutoTUnref<GrOptDrawState> optState(GrOptDrawState::Create(this->getDrawState(), |
- *this->caps(), |
+ this, |
+ dstCopy, |
type)); |
if (!optState) { |
@@ -234,13 +233,7 @@ bool GrGpuGL::flushGraphicsState(DrawType type, |
return false; |
} |
- GrGLProgramDesc desc; |
- if (!GrGLProgramDesc::Build(*optState.get(), type, this, dstCopy, &desc)) { |
- SkDEBUGFAIL("Failed to generate GL program descriptor"); |
- return false; |
- } |
- |
- fCurrentProgram.reset(fProgramCache->getProgram(*optState.get(), desc, type)); |
+ fCurrentProgram.reset(fProgramCache->getProgram(*optState.get(), type)); |
if (NULL == fCurrentProgram.get()) { |
SkDEBUGFAIL("Failed to create program!"); |
return false; |
@@ -279,7 +272,7 @@ bool GrGpuGL::flushGraphicsState(DrawType type, |
void GrGpuGL::setupGeometry(const DrawInfo& info, size_t* indexOffsetInBytes) { |
SkAutoTUnref<GrOptDrawState> optState( |
- GrOptDrawState::Create(this->getDrawState(), *this->caps(), |
+ GrOptDrawState::Create(this->getDrawState(), this, info.getDstCopy(), |
PrimTypeToDrawType(info.primitiveType()))); |
// If the optState would is NULL it should have been caught in flushGraphicsState before getting |
@@ -361,3 +354,13 @@ void GrGpuGL::setupGeometry(const DrawInfo& info, size_t* indexOffsetInBytes) { |
attribState->disableUnusedArrays(this, usedAttribArraysMask); |
} |
} |
+ |
+void GrGpuGL::buildProgramDesc(const GrOptDrawState& optState, |
+ const GrProgramDesc::DescInfo& descInfo, |
+ GrGpu::DrawType drawType, |
+ const GrDeviceCoordTexture* dstCopy, |
+ GrProgramDesc* desc) { |
+ if (!GrGLProgramDescBuilder::Build(optState, descInfo, drawType, this, dstCopy, desc)) { |
+ SkDEBUGFAIL("Failed to generate GL program descriptor"); |
+ } |
+} |