Index: experimental/iOSSampleApp/SkSampleUIView.mm |
diff --git a/experimental/iOSSampleApp/SkSampleUIView.mm b/experimental/iOSSampleApp/SkSampleUIView.mm |
index b4c6b1cd2be983ec1df4c03c7cf4e3a526bf016b..b1e04873cd35d5e8e5e14650bcb2837fb62b48a8 100644 |
--- a/experimental/iOSSampleApp/SkSampleUIView.mm |
+++ b/experimental/iOSSampleApp/SkSampleUIView.mm |
@@ -32,9 +32,9 @@ public: |
#if SK_SUPPORT_GPU |
fCurContext = NULL; |
fCurIntf = NULL; |
- fCurRenderTarget = NULL; |
fMSAASampleCount = 0; |
- fLayerFBO = layerFBO; |
+ fDeepColor = false; |
+ fActualColorBits = 0; |
#endif |
fBackend = SkOSWindow::kNone_BackEndType; |
} |
@@ -43,7 +43,6 @@ public: |
#if SK_SUPPORT_GPU |
SkSafeUnref(fCurContext); |
SkSafeUnref(fCurIntf); |
- SkSafeUnref(fCurRenderTarget); |
#endif |
} |
@@ -71,6 +70,9 @@ public: |
return; |
} |
fMSAASampleCount = msaaSampleCount; |
+ fDeepColor = deepColor; |
+ // Assume that we have at least 24-bit output, for backends that don't supply this data |
+ fActualColorBits = SkTMax(info.fColorBits, 24); |
SkASSERT(NULL == fCurIntf); |
switch (win->getDeviceType()) { |
@@ -112,20 +114,27 @@ public: |
SkSafeUnref(fCurIntf); |
fCurIntf = NULL; |
- SkSafeUnref(fCurRenderTarget); |
- fCurRenderTarget = NULL; |
+ fGpuSurface = nullptr; |
#endif |
win->release(); |
fBackend = SampleWindow::kNone_BackEndType; |
} |
- SkSurface* createSurface(SampleWindow::DeviceType dType, SampleWindow* win) override{ |
+ sk_sp<SkSurface> makeSurface(SampleWindow::DeviceType dType, SampleWindow* win) override { |
#if SK_SUPPORT_GPU |
if (SampleWindow::IsGpuDeviceType(dType) && fCurContext) { |
SkSurfaceProps props(win->getSurfaceProps()); |
- return SkSurface::MakeRenderTargetDirect(fCurRenderTarget, |
- sk_ref_sp(win->info().colorSpace()), |
- &props).release(); |
+ if (kRGBA_F16_SkColorType == win->info().colorType() || fActualColorBits > 24) { |
+ // If we're rendering to F16, we need an off-screen surface - the current render |
+ // target is most likely the wrong format. |
+ // |
+ // If we're using a deep (10-bit or higher) surface, we probably need an off-screen |
+ // surface. 10-bit, in particular, has strange gamma behavior. |
+ return SkSurface::MakeRenderTarget(fCurContext, SkBudgeted::kNo, win->info(), |
+ fMSAASampleCount, &props); |
+ } else { |
+ return fGpuSurface; |
+ } |
} |
#endif |
return nullptr; |
@@ -141,29 +150,18 @@ public: |
#endif |
win->present(); |
} |
- |
+ |
void windowSizeChanged(SampleWindow* win) override { |
#if SK_SUPPORT_GPU |
- if (NULL != fCurContext) { |
- SkOSWindow::AttachmentInfo info; |
- |
- win->attach(fBackend, fMSAASampleCount, false, &info); |
- |
- glBindFramebuffer(GL_FRAMEBUFFER, fLayerFBO); |
- GrBackendRenderTargetDesc desc; |
- desc.fWidth = SkScalarRoundToInt(win->width()); |
- desc.fHeight = SkScalarRoundToInt(win->height()); |
- desc.fConfig = kSkia8888_GrPixelConfig; |
- desc.fRenderTargetHandle = fLayerFBO; |
- desc.fSampleCnt = info.fSampleCount; |
- desc.fStencilBits = info.fStencilBits; |
- |
- SkSafeUnref(fCurRenderTarget); |
- fCurRenderTarget = fCurContext->textureProvider()->wrapBackendRenderTarget(desc); |
+ if (fCurContext) { |
+ SampleWindow::AttachmentInfo attachmentInfo; |
+ win->attach(fBackend, fMSAASampleCount, fDeepColor, &attachmentInfo); |
+ fActualColorBits = SkTMax(attachmentInfo.fColorBits, 24); |
+ fGpuSurface = win->makeGpuBackedSurface(attachmentInfo, fCurIntf, fCurContext); |
} |
#endif |
} |
- |
+ |
GrContext* getGrContext() override { |
#if SK_SUPPORT_GPU |
return fCurContext; |
@@ -171,29 +169,34 @@ public: |
return NULL; |
#endif |
} |
- |
- GrRenderTarget* getGrRenderTarget() override { |
+ |
+ int numColorSamples() const override { |
#if SK_SUPPORT_GPU |
- return fCurRenderTarget; |
+ return fMSAASampleCount; |
#else |
- return NULL; |
+ return 0; |
#endif |
} |
int getColorBits() override { |
+#if SK_SUPPORT_GPU |
+ return fActualColorBits; |
+#else |
return 24; |
+#endif |
} |
bool isUsingGL() const { return SkOSWindow::kNone_BackEndType != fBackend; } |
- |
+ |
private: |
- |
+ |
#if SK_SUPPORT_GPU |
GrContext* fCurContext; |
const GrGLInterface* fCurIntf; |
- GrRenderTarget* fCurRenderTarget; |
+ sk_sp<SkSurface> fGpuSurface; |
int fMSAASampleCount; |
- GLint fLayerFBO; |
+ bool fDeepColor; |
+ int fActualColorBits; |
#endif |
SkOSWindow::SkBackEndTypes fBackend; |
@@ -419,7 +422,7 @@ static FPSState gFPS; |
glViewport(0, 0, fGL.fWidth, fGL.fHeight); |
- SkAutoTUnref<SkSurface> surface(fWind->createSurface()); |
+ sk_sp<SkSurface> surface(fWind->makeSurface()); |
SkCanvas* canvas = surface->getCanvas(); |
// if we're not "retained", then we have to always redraw everything. |
@@ -436,7 +439,7 @@ static FPSState gFPS; |
} |
- (void)drawInRaster { |
- SkAutoTUnref<SkSurface> surface(fWind->createSurface()); |
+ sk_sp<SkSurface> surface(fWind->makeSurface()); |
SkCanvas* canvas = surface->getCanvas(); |
[self drawWithCanvas:canvas]; |
CGImageRef cgimage = SkCreateCGImageRef(fWind->getBitmap()); |