diff options
author | 2011-07-06 19:52:16 +0000 | |
---|---|---|
committer | 2011-07-06 19:52:16 +0000 | |
commit | 1e257a5db32e1c9e3b0dba80f43470816ef948af (patch) | |
tree | f34fff9c1244a4861cc61e9f377bb845a7f09f64 /gpu | |
parent | 45f9ce7a62b27fc2ebd87e9a348a6c3f6dfde3af (diff) |
Remove nested scope resolutions in GrGpuGLShaders and use enum counts for generating random values in unit test.
git-svn-id: http://skia.googlecode.com/svn/trunk@1807 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'gpu')
-rw-r--r-- | gpu/src/GrGLProgram.h | 13 | ||||
-rw-r--r-- | gpu/src/GrGpuGLShaders.cpp | 119 | ||||
-rw-r--r-- | gpu/src/GrGpuGLShaders.h | 9 |
3 files changed, 70 insertions, 71 deletions
diff --git a/gpu/src/GrGLProgram.h b/gpu/src/GrGLProgram.h index 5c4727b229..2c4152d4ca 100644 --- a/gpu/src/GrGLProgram.h +++ b/gpu/src/GrGLProgram.h @@ -107,17 +107,23 @@ private: }; enum Modulation { kColor_Modulation, - kAlpha_Modulation + kAlpha_Modulation, + + kModulationCnt }; enum FetchMode { kSingle_FetchMode, - k2x2_FetchMode + k2x2_FetchMode, + + kFetchModeCnt, }; enum CoordMapping { kIdentity_CoordMapping, kRadialGradient_CoordMapping, kSweepGradient_CoordMapping, - kRadial2Gradient_CoordMapping + kRadial2Gradient_CoordMapping, + + kCoordMappingCnt }; uint8_t fOptFlags; @@ -150,6 +156,7 @@ private: kCoverage_DualSrcOutput, kCoverageISA_DualSrcOutput, kCoverageISC_DualSrcOutput, + kDualSrcOutputCnt }; diff --git a/gpu/src/GrGpuGLShaders.cpp b/gpu/src/GrGpuGLShaders.cpp index 13f7543ae5..2de995081a 100644 --- a/gpu/src/GrGpuGLShaders.cpp +++ b/gpu/src/GrGpuGLShaders.cpp @@ -134,36 +134,31 @@ void GrGpuGLShaders::abandonResources(){ fProgramCache->abandon(); } -void GrGpuGLShaders::DeleteProgram(GrGLProgram::CachedData* programData) { +void GrGpuGLShaders::DeleteProgram(CachedData* programData) { GR_GL(DeleteShader(programData->fVShaderID)); GR_GL(DeleteShader(programData->fFShaderID)); GR_GL(DeleteProgram(programData->fProgramID)); GR_DEBUGCODE(memset(programData, 0, sizeof(*programData));) } +//////////////////////////////////////////////////////////////////////////////// + +namespace { + template <typename T> + T random_val(GrRandom* r, T count) { + return (T)(int)(r->nextF() * count); + } +}; + void GrGpuGLShaders::ProgramUnitTest() { static const int STAGE_OPTS[] = { 0, - GrGLProgram::ProgramDesc::StageDesc::kNoPerspective_OptFlagBit, - GrGLProgram::ProgramDesc::StageDesc::kIdentity_CoordMapping - }; - static const GrGLProgram::ProgramDesc::StageDesc::Modulation STAGE_MODULATES[] = { - GrGLProgram::ProgramDesc::StageDesc::kColor_Modulation, - GrGLProgram::ProgramDesc::StageDesc::kAlpha_Modulation - }; - static const GrGLProgram::ProgramDesc::StageDesc::CoordMapping STAGE_COORD_MAPPINGS[] = { - GrGLProgram::ProgramDesc::StageDesc::kIdentity_CoordMapping, - GrGLProgram::ProgramDesc::StageDesc::kRadialGradient_CoordMapping, - GrGLProgram::ProgramDesc::StageDesc::kSweepGradient_CoordMapping, - GrGLProgram::ProgramDesc::StageDesc::kRadial2Gradient_CoordMapping - }; - static const GrGLProgram::ProgramDesc::StageDesc::FetchMode FETCH_MODES[] = { - GrGLProgram::ProgramDesc::StageDesc::kSingle_FetchMode, - GrGLProgram::ProgramDesc::StageDesc::k2x2_FetchMode, + StageDesc::kNoPerspective_OptFlagBit, + StageDesc::kIdentity_CoordMapping }; GrGLProgram program; - GrGLProgram::ProgramDesc& pdesc = program.fProgramDesc; + ProgramDesc& pdesc = program.fProgramDesc; static const int NUM_TESTS = 512; @@ -184,11 +179,11 @@ void GrGpuGLShaders::ProgramUnitTest() { pdesc.fEmitsPointSize = random.nextF() > .5f; float colorType = random.nextF(); if (colorType < 1.f / 3.f) { - pdesc.fColorType = GrGLProgram::ProgramDesc::kAttribute_ColorType; + pdesc.fColorType = ProgramDesc::kAttribute_ColorType; } else if (colorType < 2.f / 3.f) { - pdesc.fColorType = GrGLProgram::ProgramDesc::kUniform_ColorType; + pdesc.fColorType = ProgramDesc::kUniform_ColorType; } else { - pdesc.fColorType = GrGLProgram::ProgramDesc::kNone_ColorType; + pdesc.fColorType = ProgramDesc::kNone_ColorType; } int idx = (int)(random.nextF() * (SkXfermode::kCoeffModesCnt)); @@ -202,11 +197,10 @@ void GrGpuGLShaders::ProgramUnitTest() { if (fDualSourceBlendingSupport) { pdesc.fDualSrcOutput = - (GrGLProgram::ProgramDesc::DualSrcOutput) - (int)(random.nextF() * GrGLProgram::ProgramDesc::kDualSrcOutputCnt); + (ProgramDesc::DualSrcOutput) + (int)(random.nextF() * ProgramDesc::kDualSrcOutputCnt); } else { - pdesc.fDualSrcOutput = - GrGLProgram::ProgramDesc::kNone_DualSrcOutput; + pdesc.fDualSrcOutput = ProgramDesc::kNone_DualSrcOutput; } for (int s = 0; s < kNumStages; ++s) { @@ -225,16 +219,14 @@ void GrGpuGLShaders::ProgramUnitTest() { pdesc.fVertexLayout |= kTextFormat_VertexLayoutBit; } idx = (int)(random.nextF() * GR_ARRAY_COUNT(STAGE_OPTS)); - pdesc.fStages[s].fOptFlags = STAGE_OPTS[idx]; - idx = (int)(random.nextF() * GR_ARRAY_COUNT(STAGE_MODULATES)); - pdesc.fStages[s].fModulation = STAGE_MODULATES[idx]; - idx = (int)(random.nextF() * GR_ARRAY_COUNT(STAGE_COORD_MAPPINGS)); - pdesc.fStages[s].fCoordMapping = STAGE_COORD_MAPPINGS[idx]; - idx = (int)(random.nextF() * GR_ARRAY_COUNT(FETCH_MODES)); - pdesc.fStages[s].fFetchMode = FETCH_MODES[idx]; - pdesc.fStages[s].setEnabled(VertexUsesStage(s, pdesc.fVertexLayout)); + StageDesc& stage = pdesc.fStages[s]; + stage.fOptFlags = STAGE_OPTS[idx]; + stage.fModulation = random_val(&random, StageDesc::kModulationCnt); + stage.fCoordMapping = random_val(&random, StageDesc::kCoordMappingCnt); + stage.fFetchMode = random_val(&random, StageDesc::kFetchModeCnt); + stage.setEnabled(VertexUsesStage(s, pdesc.fVertexLayout)); } - GrGLProgram::CachedData cachedData; + CachedData cachedData; program.genProgram(&cachedData); DeleteProgram(&cachedData); bool again = false; @@ -251,7 +243,7 @@ GrGpuGLShaders::GrGpuGLShaders() { f4X4DownsampleFilterSupport = true; if (GR_GL_SUPPORT_DESKTOP) { - fDualSourceBlendingSupport = + fDualSourceBlendingSupport = fGLVersion >= 3.3f || this->hasExtension("GL_ARB_blend_func_extended"); } else { @@ -497,14 +489,14 @@ static const float ONE_OVER_255 = 1.f / 255.f; } void GrGpuGLShaders::flushColor() { - const GrGLProgram::ProgramDesc& desc = fCurrentProgram.getDesc(); + const ProgramDesc& desc = fCurrentProgram.getDesc(); if (this->getGeomSrc().fVertexLayout & kColor_VertexLayoutBit) { // color will be specified per-vertex as an attribute // invalidate the const vertex attrib color fHWDrawState.fColor = GrColor_ILLEGAL; } else { switch (desc.fColorType) { - case GrGLProgram::ProgramDesc::kAttribute_ColorType: + case ProgramDesc::kAttribute_ColorType: if (fHWDrawState.fColor != fCurrDrawState.fColor) { // OpenGL ES only supports the float varities of glVertexAttrib float c[] = GR_COLOR_TO_VEC4(fCurrDrawState.fColor); @@ -512,7 +504,7 @@ void GrGpuGLShaders::flushColor() { fHWDrawState.fColor = fCurrDrawState.fColor; } break; - case GrGLProgram::ProgramDesc::kUniform_ColorType: + case ProgramDesc::kUniform_ColorType: if (fProgramData->fColor != fCurrDrawState.fColor) { // OpenGL ES only supports the float varities of glVertexAttrib float c[] = GR_COLOR_TO_VEC4(fCurrDrawState.fColor); @@ -522,7 +514,7 @@ void GrGpuGLShaders::flushColor() { fProgramData->fColor = fCurrDrawState.fColor; } break; - case GrGLProgram::ProgramDesc::kNone_ColorType: + case ProgramDesc::kNone_ColorType: GrAssert(0xffffffff == fCurrDrawState.fColor); break; default: @@ -700,7 +692,7 @@ void GrGpuGLShaders::setupGeometry(int* startVertex, } void GrGpuGLShaders::buildProgram(GrPrimitiveType type) { - GrGLProgram::ProgramDesc& desc = fCurrentProgram.fProgramDesc; + ProgramDesc& desc = fCurrentProgram.fProgramDesc; // Must initialize all fields or cache will have false negatives! desc.fVertexLayout = this->getGeomSrc().fVertexLayout; @@ -717,17 +709,17 @@ void GrGpuGLShaders::buildProgram(GrPrimitiveType type) { #if GR_AGGRESSIVE_SHADER_OPTS if (!requiresAttributeColors && (0xffffffff == fCurrDrawState.fColor)) { - desc.fColorType = GrGLProgram::ProgramDesc::kNone_ColorType; + desc.fColorType = ProgramDesc::kNone_ColorType; } else #endif #if GR_GL_NO_CONSTANT_ATTRIBUTES if (!requiresAttributeColors) { - desc.fColorType = GrGLProgram::ProgramDesc::kUniform_ColorType; + desc.fColorType = ProgramDesc::kUniform_ColorType; } else #endif { if (requiresAttributeColors) {} // suppress unused var warning - desc.fColorType = GrGLProgram::ProgramDesc::kAttribute_ColorType; + desc.fColorType = ProgramDesc::kAttribute_ColorType; } desc.fEdgeAANumEdges = fCurrDrawState.fEdgeAANumEdges; @@ -736,7 +728,7 @@ void GrGpuGLShaders::buildProgram(GrPrimitiveType type) { int lastEnabledStage = -1; for (int s = 0; s < kNumStages; ++s) { - GrGLProgram::ProgramDesc::StageDesc& stage = desc.fStages[s]; + StageDesc& stage = desc.fStages[s]; stage.fOptFlags = 0; stage.setEnabled(this->isStageEnabled(s)); @@ -748,22 +740,22 @@ void GrGpuGLShaders::buildProgram(GrPrimitiveType type) { // we matrix to invert when orientation is TopDown, so make sure // we aren't in that case before flagging as identity. if (TextureMatrixIsIdentity(texture, fCurrDrawState.fSamplerStates[s])) { - stage.fOptFlags |= GrGLProgram::ProgramDesc::StageDesc::kIdentityMatrix_OptFlagBit; + stage.fOptFlags |= StageDesc::kIdentityMatrix_OptFlagBit; } else if (!getSamplerMatrix(s).hasPerspective()) { - stage.fOptFlags |= GrGLProgram::ProgramDesc::StageDesc::kNoPerspective_OptFlagBit; + stage.fOptFlags |= StageDesc::kNoPerspective_OptFlagBit; } switch (fCurrDrawState.fSamplerStates[s].getSampleMode()) { case GrSamplerState::kNormal_SampleMode: - stage.fCoordMapping = GrGLProgram::ProgramDesc::StageDesc::kIdentity_CoordMapping; + stage.fCoordMapping = StageDesc::kIdentity_CoordMapping; break; case GrSamplerState::kRadial_SampleMode: - stage.fCoordMapping = GrGLProgram::ProgramDesc::StageDesc::kRadialGradient_CoordMapping; + stage.fCoordMapping = StageDesc::kRadialGradient_CoordMapping; break; case GrSamplerState::kRadial2_SampleMode: - stage.fCoordMapping = GrGLProgram::ProgramDesc::StageDesc::kRadial2Gradient_CoordMapping; + stage.fCoordMapping = StageDesc::kRadial2Gradient_CoordMapping; break; case GrSamplerState::kSweep_SampleMode: - stage.fCoordMapping = GrGLProgram::ProgramDesc::StageDesc::kSweepGradient_CoordMapping; + stage.fCoordMapping = StageDesc::kSweepGradient_CoordMapping; break; default: GrCrash("Unexpected sample mode!"); @@ -774,11 +766,11 @@ void GrGpuGLShaders::buildProgram(GrPrimitiveType type) { // these both can use a regular texture2D() case GrSamplerState::kNearest_Filter: case GrSamplerState::kBilinear_Filter: - stage.fFetchMode = GrGLProgram::ProgramDesc::StageDesc::kSingle_FetchMode; + stage.fFetchMode = StageDesc::kSingle_FetchMode; break; // performs 4 texture2D()s case GrSamplerState::k4x4Downsample_Filter: - stage.fFetchMode = GrGLProgram::ProgramDesc::StageDesc::k2x2_FetchMode; + stage.fFetchMode = StageDesc::k2x2_FetchMode; break; default: GrCrash("Unexpected filter!"); @@ -790,24 +782,22 @@ void GrGpuGLShaders::buildProgram(GrPrimitiveType type) { fCurrDrawState.fSamplerStates[s].getWrapX() && GrSamplerState::kClamp_WrapMode == fCurrDrawState.fSamplerStates[s].getWrapY()); - stage.fOptFlags |= - GrGLProgram::ProgramDesc::StageDesc:: - kCustomTextureDomain_OptFlagBit; + stage.fOptFlags |= StageDesc::kCustomTextureDomain_OptFlagBit; } if (GrPixelConfigIsAlphaOnly(texture->config())) { - stage.fModulation = GrGLProgram::ProgramDesc::StageDesc::kAlpha_Modulation; + stage.fModulation = StageDesc::kAlpha_Modulation; } else { - stage.fModulation = GrGLProgram::ProgramDesc::StageDesc::kColor_Modulation; + stage.fModulation = StageDesc::kColor_Modulation; } } else { stage.fOptFlags = 0; - stage.fCoordMapping = (GrGLProgram::ProgramDesc::StageDesc::CoordMapping)0; - stage.fModulation = (GrGLProgram::ProgramDesc::StageDesc::Modulation)0; + stage.fCoordMapping = (StageDesc::CoordMapping)0; + stage.fModulation = (StageDesc::Modulation)0; } } - desc.fDualSrcOutput = GrGLProgram::ProgramDesc::kNone_DualSrcOutput; + desc.fDualSrcOutput = ProgramDesc::kNone_DualSrcOutput; // use canonical value when coverage/color distinction won't affect // generated code to prevent duplicate programs. desc.fFirstCoverageStage = kNumStages; @@ -825,20 +815,17 @@ void GrGpuGLShaders::buildProgram(GrPrimitiveType type) { if (fDualSourceBlendingSupport) { if (kZero_BlendCoeff == fCurrDrawState.fDstBlend) { // write the coverage value to second color - desc.fDualSrcOutput = - GrGLProgram::ProgramDesc::kCoverage_DualSrcOutput; + desc.fDualSrcOutput = ProgramDesc::kCoverage_DualSrcOutput; desc.fFirstCoverageStage = fCurrDrawState.fFirstCoverageStage; } else if (kSA_BlendCoeff == fCurrDrawState.fDstBlend) { // SA dst coeff becomes 1-(1-SA)*coverage when dst is partially // cover - desc.fDualSrcOutput = - GrGLProgram::ProgramDesc::kCoverageISA_DualSrcOutput; + desc.fDualSrcOutput = ProgramDesc::kCoverageISA_DualSrcOutput; desc.fFirstCoverageStage = fCurrDrawState.fFirstCoverageStage; } else if (kSC_BlendCoeff == fCurrDrawState.fDstBlend) { // SA dst coeff becomes 1-(1-SA)*coverage when dst is partially // cover - desc.fDualSrcOutput = - GrGLProgram::ProgramDesc::kCoverageISC_DualSrcOutput; + desc.fDualSrcOutput = ProgramDesc::kCoverageISC_DualSrcOutput; desc.fFirstCoverageStage = fCurrDrawState.fFirstCoverageStage; } } diff --git a/gpu/src/GrGpuGLShaders.h b/gpu/src/GrGpuGLShaders.h index 557a4e3f7e..17811c84bf 100644 --- a/gpu/src/GrGpuGLShaders.h +++ b/gpu/src/GrGpuGLShaders.h @@ -44,6 +44,11 @@ protected: private: + // for readability of function impls + typedef GrGLProgram::ProgramDesc ProgramDesc; + typedef ProgramDesc::StageDesc StageDesc; + typedef GrGLProgram::CachedData CachedData; + class ProgramCache; // Helpers to make code more readable @@ -71,14 +76,14 @@ private: // flushes the edges for edge AA void flushEdgeAAData(); - static void DeleteProgram(GrGLProgram::CachedData* programData); + static void DeleteProgram(CachedData* programData); void ProgramUnitTest(); void buildProgram(GrPrimitiveType type); ProgramCache* fProgramCache; - GrGLProgram::CachedData* fProgramData; + CachedData* fProgramData; GrGLuint fHWProgramID; GrGLProgram fCurrentProgram; |