Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(20)

Side by Side Diff: src/gpu/gl/GrGLGpu.cpp

Issue 1001503002: Implement support for mixed sampled render targets (Closed) Base URL: https://skia.googlesource.com/skia.git@mix1
Patch Set: Rebase Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright 2011 Google Inc. 2 * Copyright 2011 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 8
9 #include "GrGLGpu.h" 9 #include "GrGLGpu.h"
10 #include "GrGLStencilAttachment.h" 10 #include "GrGLStencilAttachment.h"
(...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after
366 // On some devices this may have a perf hit. Also multiple render t argets are disabled 366 // On some devices this may have a perf hit. Also multiple render t argets are disabled
367 GL_CALL(Enable(GR_GL_FETCH_PER_SAMPLE_ARM)); 367 GL_CALL(Enable(GR_GL_FETCH_PER_SAMPLE_ARM));
368 } 368 }
369 fHWWriteToColor = kUnknown_TriState; 369 fHWWriteToColor = kUnknown_TriState;
370 // we only ever use lines in hairline mode 370 // we only ever use lines in hairline mode
371 GL_CALL(LineWidth(1)); 371 GL_CALL(LineWidth(1));
372 } 372 }
373 373
374 if (resetBits & kMSAAEnable_GrGLBackendState) { 374 if (resetBits & kMSAAEnable_GrGLBackendState) {
375 fMSAAEnabled = kUnknown_TriState; 375 fMSAAEnabled = kUnknown_TriState;
376 fCoverageModulationEnabled = kUnknown_TriState;
Chris Dalton 2015/06/09 17:39:51 At this point we can just call: glCoverageModula
376 } 377 }
377 378
378 fHWActiveTextureUnitIdx = -1; // invalid 379 fHWActiveTextureUnitIdx = -1; // invalid
379 380
380 if (resetBits & kTextureBinding_GrGLBackendState) { 381 if (resetBits & kTextureBinding_GrGLBackendState) {
381 for (int s = 0; s < fHWBoundTextureUniqueIDs.count(); ++s) { 382 for (int s = 0; s < fHWBoundTextureUniqueIDs.count(); ++s) {
382 fHWBoundTextureUniqueIDs[s] = SK_InvalidUniqueID; 383 fHWBoundTextureUniqueIDs[s] = SK_InvalidUniqueID;
383 } 384 }
384 } 385 }
385 386
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
497 } 498 }
498 499
499 return texture; 500 return texture;
500 } 501 }
501 502
502 GrRenderTarget* GrGLGpu::onWrapBackendRenderTarget(const GrBackendRenderTargetDe sc& wrapDesc) { 503 GrRenderTarget* GrGLGpu::onWrapBackendRenderTarget(const GrBackendRenderTargetDe sc& wrapDesc) {
503 GrGLRenderTarget::IDDesc idDesc; 504 GrGLRenderTarget::IDDesc idDesc;
504 idDesc.fRTFBOID = static_cast<GrGLuint>(wrapDesc.fRenderTargetHandle); 505 idDesc.fRTFBOID = static_cast<GrGLuint>(wrapDesc.fRenderTargetHandle);
505 idDesc.fMSColorRenderbufferID = 0; 506 idDesc.fMSColorRenderbufferID = 0;
506 idDesc.fTexFBOID = GrGLRenderTarget::kUnresolvableFBOID; 507 idDesc.fTexFBOID = GrGLRenderTarget::kUnresolvableFBOID;
508 idDesc.fSampleConfig = (wrapDesc.fFlags & kStencilMSAAOnly_GrBackendRenderTa rgetFlags) ?
Chris Dalton 2015/06/09 17:39:51 Here we ought to ignore the multisample stencil bu
509 GrRenderTarget::kStencil_SampleConfig :
510 GrRenderTarget::kUnified_SampleConfig;
507 idDesc.fLifeCycle = GrGpuResource::kWrapped_LifeCycle; 511 idDesc.fLifeCycle = GrGpuResource::kWrapped_LifeCycle;
508 512
509 GrSurfaceDesc desc; 513 GrSurfaceDesc desc;
510 desc.fConfig = wrapDesc.fConfig; 514 desc.fConfig = wrapDesc.fConfig;
511 desc.fFlags = kCheckAllocation_GrSurfaceFlag; 515 desc.fFlags = kCheckAllocation_GrSurfaceFlag;
512 desc.fWidth = wrapDesc.fWidth; 516 desc.fWidth = wrapDesc.fWidth;
513 desc.fHeight = wrapDesc.fHeight; 517 desc.fHeight = wrapDesc.fHeight;
514 desc.fSampleCnt = SkTMin(wrapDesc.fSampleCnt, this->caps()->maxSampleCount() ); 518 desc.fSampleCnt = SkTMin(wrapDesc.fSampleCnt, this->caps()->maxSampleCount() );
515 desc.fOrigin = resolve_origin(wrapDesc.fOrigin, true); 519 desc.fOrigin = resolve_origin(wrapDesc.fOrigin, true);
516 520
(...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after
844 848
845 static bool renderbuffer_storage_msaa(const GrGLContext& ctx, 849 static bool renderbuffer_storage_msaa(const GrGLContext& ctx,
846 int sampleCount, 850 int sampleCount,
847 GrGLenum format, 851 GrGLenum format,
848 int width, int height) { 852 int width, int height) {
849 CLEAR_ERROR_BEFORE_ALLOC(ctx.interface()); 853 CLEAR_ERROR_BEFORE_ALLOC(ctx.interface());
850 SkASSERT(GrGLCaps::kNone_MSFBOType != ctx.caps()->msFBOType()); 854 SkASSERT(GrGLCaps::kNone_MSFBOType != ctx.caps()->msFBOType());
851 switch (ctx.caps()->msFBOType()) { 855 switch (ctx.caps()->msFBOType()) {
852 case GrGLCaps::kDesktop_ARB_MSFBOType: 856 case GrGLCaps::kDesktop_ARB_MSFBOType:
853 case GrGLCaps::kDesktop_EXT_MSFBOType: 857 case GrGLCaps::kDesktop_EXT_MSFBOType:
858 case GrGLCaps::kMixedSamples_MSFBOType:
854 case GrGLCaps::kES_3_0_MSFBOType: 859 case GrGLCaps::kES_3_0_MSFBOType:
855 GL_ALLOC_CALL(ctx.interface(), 860 GL_ALLOC_CALL(ctx.interface(),
856 RenderbufferStorageMultisample(GR_GL_RENDERBUFFER, 861 RenderbufferStorageMultisample(GR_GL_RENDERBUFFER,
857 sampleCount, 862 sampleCount,
858 format, 863 format,
859 width, height)); 864 width, height));
860 break; 865 break;
861 case GrGLCaps::kES_Apple_MSFBOType: 866 case GrGLCaps::kES_Apple_MSFBOType:
862 GL_ALLOC_CALL(ctx.interface(), 867 GL_ALLOC_CALL(ctx.interface(),
863 RenderbufferStorageMultisampleES2APPLE(GR_GL_RENDERB UFFER, 868 RenderbufferStorageMultisampleES2APPLE(GR_GL_RENDERB UFFER,
(...skipping 17 matching lines...) Expand all
881 } 886 }
882 887
883 bool GrGLGpu::createRenderTargetObjects(const GrSurfaceDesc& desc, 888 bool GrGLGpu::createRenderTargetObjects(const GrSurfaceDesc& desc,
884 GrGpuResource::LifeCycle lifeCycle, 889 GrGpuResource::LifeCycle lifeCycle,
885 GrGLuint texID, 890 GrGLuint texID,
886 GrGLRenderTarget::IDDesc* idDesc) { 891 GrGLRenderTarget::IDDesc* idDesc) {
887 idDesc->fMSColorRenderbufferID = 0; 892 idDesc->fMSColorRenderbufferID = 0;
888 idDesc->fRTFBOID = 0; 893 idDesc->fRTFBOID = 0;
889 idDesc->fTexFBOID = 0; 894 idDesc->fTexFBOID = 0;
890 idDesc->fLifeCycle = lifeCycle; 895 idDesc->fLifeCycle = lifeCycle;
896 idDesc->fSampleConfig = GrGLCaps::kMixedSamples_MSFBOType ==
897 this->glCaps().msFBOType() ? GrRenderTarget::kStenci l_SampleConfig :
898 GrRenderTarget::kUnifie d_SampleConfig;
891 899
892 GrGLenum status; 900 GrGLenum status;
893 901
894 GrGLenum msColorFormat = 0; // suppress warning 902 GrGLenum msColorFormat = 0; // suppress warning
895 903
896 if (desc.fSampleCnt > 0 && GrGLCaps::kNone_MSFBOType == this->glCaps().msFBO Type()) { 904 if (desc.fSampleCnt > 0 && GrGLCaps::kNone_MSFBOType == this->glCaps().msFBO Type()) {
897 goto FAILED; 905 goto FAILED;
898 } 906 }
899 907
900 GL_CALL(GenFramebuffers(1, &idDesc->fTexFBOID)); 908 GL_CALL(GenFramebuffers(1, &idDesc->fTexFBOID));
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after
1163 } 1171 }
1164 } 1172 }
1165 1173
1166 bool GrGLGpu::createStencilAttachmentForRenderTarget(GrRenderTarget* rt, int wid th, int height) { 1174 bool GrGLGpu::createStencilAttachmentForRenderTarget(GrRenderTarget* rt, int wid th, int height) {
1167 // All internally created RTs are also textures. We don't create 1175 // All internally created RTs are also textures. We don't create
1168 // SBs for a client's standalone RT (that is a RT that isn't also a texture) . 1176 // SBs for a client's standalone RT (that is a RT that isn't also a texture) .
1169 SkASSERT(rt->asTexture()); 1177 SkASSERT(rt->asTexture());
1170 SkASSERT(width >= rt->width()); 1178 SkASSERT(width >= rt->width());
1171 SkASSERT(height >= rt->height()); 1179 SkASSERT(height >= rt->height());
1172 1180
1173 int samples = rt->numSamples(); 1181 int samples = rt->numStencilSamples();
1174 GrGLStencilAttachment::IDDesc sbDesc; 1182 GrGLStencilAttachment::IDDesc sbDesc;
1175 1183
1176 int stencilFmtCnt = this->glCaps().stencilFormats().count(); 1184 int stencilFmtCnt = this->glCaps().stencilFormats().count();
1177 for (int i = 0; i < stencilFmtCnt; ++i) { 1185 for (int i = 0; i < stencilFmtCnt; ++i) {
1178 if (!sbDesc.fRenderbufferID) { 1186 if (!sbDesc.fRenderbufferID) {
1179 GL_CALL(GenRenderbuffers(1, &sbDesc.fRenderbufferID)); 1187 GL_CALL(GenRenderbuffers(1, &sbDesc.fRenderbufferID));
1180 } 1188 }
1181 if (!sbDesc.fRenderbufferID) { 1189 if (!sbDesc.fRenderbufferID) {
1182 return false; 1190 return false;
1183 } 1191 }
(...skipping 899 matching lines...) Expand 10 before | Expand all | Expand 10 after
2083 stencilSettings, 2091 stencilSettings,
2084 GR_GL_FRONT_AND_BACK, 2092 GR_GL_FRONT_AND_BACK,
2085 GrStencilSettings::kFront_Face); 2093 GrStencilSettings::kFront_Face);
2086 } 2094 }
2087 } 2095 }
2088 fHWStencilSettings = stencilSettings; 2096 fHWStencilSettings = stencilSettings;
2089 } 2097 }
2090 } 2098 }
2091 2099
2092 void GrGLGpu::flushHWAAState(GrRenderTarget* rt, bool useHWAA) { 2100 void GrGLGpu::flushHWAAState(GrRenderTarget* rt, bool useHWAA) {
2093 SkASSERT(!useHWAA || rt->isMultisampled()); 2101 SkASSERT(!useHWAA || rt->isStencilBufferMultisampled());
2094 2102
2095 if (this->glCaps().multisampleDisableSupport()) { 2103 if (this->glCaps().multisampleDisableSupport() ||
2104 this->glCaps().shaderCaps()->mixedSamplesSupport()) {
Chris Dalton 2015/06/09 17:39:52 I would recommend rolling this into the multisampl
2096 if (useHWAA) { 2105 if (useHWAA) {
2097 if (kYes_TriState != fMSAAEnabled) { 2106 if (kYes_TriState != fMSAAEnabled) {
2098 GL_CALL(Enable(GR_GL_MULTISAMPLE)); 2107 GL_CALL(Enable(GR_GL_MULTISAMPLE));
2099 fMSAAEnabled = kYes_TriState; 2108 fMSAAEnabled = kYes_TriState;
2100 } 2109 }
2101 } else { 2110 } else {
2102 if (kNo_TriState != fMSAAEnabled) { 2111 if (kNo_TriState != fMSAAEnabled) {
2103 GL_CALL(Disable(GR_GL_MULTISAMPLE)); 2112 GL_CALL(Disable(GR_GL_MULTISAMPLE));
2104 fMSAAEnabled = kNo_TriState; 2113 fMSAAEnabled = kNo_TriState;
2105 } 2114 }
2106 } 2115 }
2107 } 2116 }
2117 if (this->glCaps().shaderCaps()->mixedSamplesSupport()) {
2118 if (useHWAA && GrRenderTarget::kStencil_SampleConfig == rt->sampleConfig ()) {
2119 if (kYes_TriState != fCoverageModulationEnabled) {
2120 GL_CALL(CoverageModulation(GR_GL_RGBA));
2121 fCoverageModulationEnabled = kYes_TriState;
2122 }
2123 } else {
2124 if (kNo_TriState != fCoverageModulationEnabled) {
2125 GL_CALL(CoverageModulation(GR_GL_NONE));
2126 fCoverageModulationEnabled = kNo_TriState;
2127 }
2128 }
2129 }
2108 } 2130 }
2109 2131
2110 void GrGLGpu::flushBlend(const GrXferProcessor::BlendInfo& blendInfo) { 2132 void GrGLGpu::flushBlend(const GrXferProcessor::BlendInfo& blendInfo) {
2111 // Any optimization to disable blending should have already been applied and 2133 // Any optimization to disable blending should have already been applied and
2112 // tweaked the equation to "add" or "subtract", and the coeffs to (1, 0). 2134 // tweaked the equation to "add" or "subtract", and the coeffs to (1, 0).
2113 2135
2114 GrBlendEquation equation = blendInfo.fEquation; 2136 GrBlendEquation equation = blendInfo.fEquation;
2115 GrBlendCoeff srcCoeff = blendInfo.fSrcBlend; 2137 GrBlendCoeff srcCoeff = blendInfo.fSrcBlend;
2116 GrBlendCoeff dstCoeff = blendInfo.fDstBlend; 2138 GrBlendCoeff dstCoeff = blendInfo.fDstBlend;
2117 bool blendOff = (kAdd_GrBlendEquation == equation || kSubtract_GrBlendEquati on == equation) && 2139 bool blendOff = (kAdd_GrBlendEquation == equation || kSubtract_GrBlendEquati on == equation) &&
(...skipping 949 matching lines...) Expand 10 before | Expand all | Expand 10 after
3067 this->setVertexArrayID(gpu, 0); 3089 this->setVertexArrayID(gpu, 0);
3068 } 3090 }
3069 int attrCount = gpu->glCaps().maxVertexAttributes(); 3091 int attrCount = gpu->glCaps().maxVertexAttributes();
3070 if (fDefaultVertexArrayAttribState.count() != attrCount) { 3092 if (fDefaultVertexArrayAttribState.count() != attrCount) {
3071 fDefaultVertexArrayAttribState.resize(attrCount); 3093 fDefaultVertexArrayAttribState.resize(attrCount);
3072 } 3094 }
3073 attribState = &fDefaultVertexArrayAttribState; 3095 attribState = &fDefaultVertexArrayAttribState;
3074 } 3096 }
3075 return attribState; 3097 return attribState;
3076 } 3098 }
OLDNEW
« src/gpu/gl/GrGLGpu.h ('K') | « src/gpu/gl/GrGLGpu.h ('k') | src/gpu/gl/GrGLRenderTarget.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698