Bug fix for es 3.00 fb fetch
patch for es 300 shader fb fetch BUG=skia: Review URL: https://codereview.chromium.org/665893008
This commit is contained in:
parent
39393e3ac3
commit
b4384b9bba
@ -7,6 +7,7 @@
|
||||
|
||||
|
||||
#include "GrGLCaps.h"
|
||||
|
||||
#include "GrGLContext.h"
|
||||
#include "SkTSearch.h"
|
||||
#include "SkTSort.h"
|
||||
|
@ -168,7 +168,7 @@ public:
|
||||
/**
|
||||
* Some helper functions for encapsulating various extensions to read FB Buffer on openglES
|
||||
*
|
||||
* TODO On desktop opengl 4.2+ we can achieve something similar to this effect
|
||||
* TODO(joshualitt) On desktop opengl 4.2+ we can achieve something similar to this effect
|
||||
*/
|
||||
bool fbFetchSupport() const { return fFBFetchSupport; }
|
||||
|
||||
@ -367,6 +367,7 @@ private:
|
||||
bool fIsCoreProfile : 1;
|
||||
bool fFullClearIsFree : 1;
|
||||
bool fDropsTileOnZeroDivide : 1;
|
||||
// TODO(joshualitt) encapsulate the FB Fetch logic in a feature object
|
||||
bool fFBFetchSupport : 1;
|
||||
|
||||
const char* fFBFetchColorName;
|
||||
|
@ -75,6 +75,7 @@ GrGLFragmentShaderBuilder::GrGLFragmentShaderBuilder(GrGLProgramBuilder* program
|
||||
, fHasSecondaryOutput(false)
|
||||
, fSetupFragPosition(false)
|
||||
, fTopLeftFragPosRead(kTopLeftFragPosRead_FragPosKey == desc.getHeader().fFragPosKey)
|
||||
, fCustomColorOutputIndex(-1)
|
||||
, fHasReadDstColor(false)
|
||||
, fHasReadFragmentPosition(false) {
|
||||
}
|
||||
@ -172,7 +173,15 @@ const char* GrGLFragmentShaderBuilder::dstColor() {
|
||||
if (gpu->glCaps().fbFetchSupport()) {
|
||||
this->addFeature(1 << (GrGLFragmentShaderBuilder::kLastGLSLPrivateFeature + 1),
|
||||
gpu->glCaps().fbFetchExtensionString());
|
||||
return gpu->glCaps().fbFetchColorName();
|
||||
|
||||
// On ES 3.0 we have to declare this, and use the custom color output name
|
||||
const char* fbFetchColorName = gpu->glCaps().fbFetchColorName();
|
||||
if (gpu->glslGeneration() >= k330_GrGLSLGeneration) {
|
||||
this->enableCustomOutput();
|
||||
fOutputs[fCustomColorOutputIndex].setTypeModifier(GrShaderVar::kInOut_TypeModifier);
|
||||
fbFetchColorName = declared_color_output_name();
|
||||
}
|
||||
return fbFetchColorName;
|
||||
} else if (fProgramBuilder->fUniformHandles.fDstCopySamplerUni.isValid()) {
|
||||
return kDstCopyColorName;
|
||||
} else {
|
||||
@ -223,11 +232,13 @@ void GrGLFragmentShaderBuilder::emitCodeToReadDstTexture() {
|
||||
}
|
||||
|
||||
void GrGLFragmentShaderBuilder::enableCustomOutput() {
|
||||
SkASSERT(!fHasCustomColorOutput);
|
||||
fHasCustomColorOutput = true;
|
||||
fOutputs.push_back().set(kVec4f_GrSLType,
|
||||
GrGLShaderVar::kOut_TypeModifier,
|
||||
declared_color_output_name());
|
||||
if (!fHasCustomColorOutput) {
|
||||
fHasCustomColorOutput = true;
|
||||
fCustomColorOutputIndex = fOutputs.count();
|
||||
fOutputs.push_back().set(kVec4f_GrSLType,
|
||||
GrGLShaderVar::kOut_TypeModifier,
|
||||
declared_color_output_name());
|
||||
}
|
||||
}
|
||||
|
||||
void GrGLFragmentShaderBuilder::enableSecondaryOutput() {
|
||||
|
@ -149,6 +149,7 @@ private:
|
||||
bool fHasSecondaryOutput;
|
||||
bool fSetupFragPosition;
|
||||
bool fTopLeftFragPosRead;
|
||||
int fCustomColorOutputIndex;
|
||||
|
||||
// some state to verify shaders and effects are consistent, this is reset between effects by
|
||||
// the program creator
|
||||
|
Loading…
Reference in New Issue
Block a user