| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 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 #import "SkSampleUIView.h" | 8 #import "SkSampleUIView.h" |
| 9 | 9 |
| 10 //#define SKGL_CONFIG kEAGLColorFormatRGB565 | 10 //#define SKGL_CONFIG kEAGLColorFormatRGB565 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 #include "GrContext.h" | 25 #include "GrContext.h" |
| 26 #include "SkGpuDevice.h" | 26 #include "SkGpuDevice.h" |
| 27 #endif | 27 #endif |
| 28 | 28 |
| 29 class SkiOSDeviceManager : public SampleWindow::DeviceManager { | 29 class SkiOSDeviceManager : public SampleWindow::DeviceManager { |
| 30 public: | 30 public: |
| 31 SkiOSDeviceManager(GLint layerFBO) { | 31 SkiOSDeviceManager(GLint layerFBO) { |
| 32 #if SK_SUPPORT_GPU | 32 #if SK_SUPPORT_GPU |
| 33 fCurContext = NULL; | 33 fCurContext = NULL; |
| 34 fCurIntf = NULL; | 34 fCurIntf = NULL; |
| 35 fCurRenderTarget = NULL; | |
| 36 fMSAASampleCount = 0; | 35 fMSAASampleCount = 0; |
| 37 fLayerFBO = layerFBO; | 36 fDeepColor = false; |
| 37 fActualColorBits = 0; |
| 38 #endif | 38 #endif |
| 39 fBackend = SkOSWindow::kNone_BackEndType; | 39 fBackend = SkOSWindow::kNone_BackEndType; |
| 40 } | 40 } |
| 41 | 41 |
| 42 virtual ~SkiOSDeviceManager() { | 42 virtual ~SkiOSDeviceManager() { |
| 43 #if SK_SUPPORT_GPU | 43 #if SK_SUPPORT_GPU |
| 44 SkSafeUnref(fCurContext); | 44 SkSafeUnref(fCurContext); |
| 45 SkSafeUnref(fCurIntf); | 45 SkSafeUnref(fCurIntf); |
| 46 SkSafeUnref(fCurRenderTarget); | |
| 47 #endif | 46 #endif |
| 48 } | 47 } |
| 49 | 48 |
| 50 void setUpBackend(SampleWindow* win, int msaaSampleCount, bool deepColor) ov
erride { | 49 void setUpBackend(SampleWindow* win, int msaaSampleCount, bool deepColor) ov
erride { |
| 51 SkASSERT(SkOSWindow::kNone_BackEndType == fBackend); | 50 SkASSERT(SkOSWindow::kNone_BackEndType == fBackend); |
| 52 | 51 |
| 53 fBackend = SkOSWindow::kNone_BackEndType; | 52 fBackend = SkOSWindow::kNone_BackEndType; |
| 54 | 53 |
| 55 #if SK_SUPPORT_GPU | 54 #if SK_SUPPORT_GPU |
| 56 switch (win->getDeviceType()) { | 55 switch (win->getDeviceType()) { |
| 57 case SampleWindow::kRaster_DeviceType: | 56 case SampleWindow::kRaster_DeviceType: |
| 58 break; | 57 break; |
| 59 // these guys use the native backend | 58 // these guys use the native backend |
| 60 case SampleWindow::kGPU_DeviceType: | 59 case SampleWindow::kGPU_DeviceType: |
| 61 fBackend = SkOSWindow::kNativeGL_BackEndType; | 60 fBackend = SkOSWindow::kNativeGL_BackEndType; |
| 62 break; | 61 break; |
| 63 default: | 62 default: |
| 64 SkASSERT(false); | 63 SkASSERT(false); |
| 65 break; | 64 break; |
| 66 } | 65 } |
| 67 SkOSWindow::AttachmentInfo info; | 66 SkOSWindow::AttachmentInfo info; |
| 68 bool result = win->attach(fBackend, msaaSampleCount, false, &info); | 67 bool result = win->attach(fBackend, msaaSampleCount, false, &info); |
| 69 if (!result) { | 68 if (!result) { |
| 70 SkDebugf("Failed to initialize GL"); | 69 SkDebugf("Failed to initialize GL"); |
| 71 return; | 70 return; |
| 72 } | 71 } |
| 73 fMSAASampleCount = msaaSampleCount; | 72 fMSAASampleCount = msaaSampleCount; |
| 73 fDeepColor = deepColor; |
| 74 // Assume that we have at least 24-bit output, for backends that don't s
upply this data |
| 75 fActualColorBits = SkTMax(info.fColorBits, 24); |
| 74 | 76 |
| 75 SkASSERT(NULL == fCurIntf); | 77 SkASSERT(NULL == fCurIntf); |
| 76 switch (win->getDeviceType()) { | 78 switch (win->getDeviceType()) { |
| 77 case SampleWindow::kRaster_DeviceType: | 79 case SampleWindow::kRaster_DeviceType: |
| 78 fCurIntf = NULL; | 80 fCurIntf = NULL; |
| 79 break; | 81 break; |
| 80 case SampleWindow::kGPU_DeviceType: | 82 case SampleWindow::kGPU_DeviceType: |
| 81 fCurIntf = GrGLCreateNativeInterface(); | 83 fCurIntf = GrGLCreateNativeInterface(); |
| 82 break; | 84 break; |
| 83 default: | 85 default: |
| (...skipping 21 matching lines...) Expand all Loading... |
| 105 } | 107 } |
| 106 | 108 |
| 107 void tearDownBackend(SampleWindow *win) override { | 109 void tearDownBackend(SampleWindow *win) override { |
| 108 #if SK_SUPPORT_GPU | 110 #if SK_SUPPORT_GPU |
| 109 SkSafeUnref(fCurContext); | 111 SkSafeUnref(fCurContext); |
| 110 fCurContext = NULL; | 112 fCurContext = NULL; |
| 111 | 113 |
| 112 SkSafeUnref(fCurIntf); | 114 SkSafeUnref(fCurIntf); |
| 113 fCurIntf = NULL; | 115 fCurIntf = NULL; |
| 114 | 116 |
| 115 SkSafeUnref(fCurRenderTarget); | 117 fGpuSurface = nullptr; |
| 116 fCurRenderTarget = NULL; | |
| 117 #endif | 118 #endif |
| 118 win->release(); | 119 win->release(); |
| 119 fBackend = SampleWindow::kNone_BackEndType; | 120 fBackend = SampleWindow::kNone_BackEndType; |
| 120 } | 121 } |
| 121 | 122 |
| 122 SkSurface* createSurface(SampleWindow::DeviceType dType, SampleWindow* win)
override{ | 123 sk_sp<SkSurface> makeSurface(SampleWindow::DeviceType dType, SampleWindow* w
in) override { |
| 123 #if SK_SUPPORT_GPU | 124 #if SK_SUPPORT_GPU |
| 124 if (SampleWindow::IsGpuDeviceType(dType) && fCurContext) { | 125 if (SampleWindow::IsGpuDeviceType(dType) && fCurContext) { |
| 125 SkSurfaceProps props(win->getSurfaceProps()); | 126 SkSurfaceProps props(win->getSurfaceProps()); |
| 126 return SkSurface::MakeRenderTargetDirect(fCurRenderTarget, | 127 if (kRGBA_F16_SkColorType == win->info().colorType() || fActualColor
Bits > 24) { |
| 127 sk_ref_sp(win->info().color
Space()), | 128 // If we're rendering to F16, we need an off-screen surface - th
e current render |
| 128 &props).release(); | 129 // target is most likely the wrong format. |
| 130 // |
| 131 // If we're using a deep (10-bit or higher) surface, we probably
need an off-screen |
| 132 // surface. 10-bit, in particular, has strange gamma behavior. |
| 133 return SkSurface::MakeRenderTarget(fCurContext, SkBudgeted::kNo,
win->info(), |
| 134 fMSAASampleCount, &props); |
| 135 } else { |
| 136 return fGpuSurface; |
| 137 } |
| 129 } | 138 } |
| 130 #endif | 139 #endif |
| 131 return nullptr; | 140 return nullptr; |
| 132 } | 141 } |
| 133 | 142 |
| 134 virtual void publishCanvas(SampleWindow::DeviceType dType, | 143 virtual void publishCanvas(SampleWindow::DeviceType dType, |
| 135 SkCanvas* canvas, | 144 SkCanvas* canvas, |
| 136 SampleWindow* win) override { | 145 SampleWindow* win) override { |
| 137 #if SK_SUPPORT_GPU | 146 #if SK_SUPPORT_GPU |
| 138 if (NULL != fCurContext) { | 147 if (NULL != fCurContext) { |
| 139 fCurContext->flush(); | 148 fCurContext->flush(); |
| 140 } | 149 } |
| 141 #endif | 150 #endif |
| 142 win->present(); | 151 win->present(); |
| 143 } | 152 } |
| 144 | 153 |
| 145 void windowSizeChanged(SampleWindow* win) override { | 154 void windowSizeChanged(SampleWindow* win) override { |
| 146 #if SK_SUPPORT_GPU | 155 #if SK_SUPPORT_GPU |
| 147 if (NULL != fCurContext) { | 156 if (fCurContext) { |
| 148 SkOSWindow::AttachmentInfo info; | 157 SampleWindow::AttachmentInfo attachmentInfo; |
| 149 | 158 win->attach(fBackend, fMSAASampleCount, fDeepColor, &attachmentInfo)
; |
| 150 win->attach(fBackend, fMSAASampleCount, false, &info); | 159 fActualColorBits = SkTMax(attachmentInfo.fColorBits, 24); |
| 151 | 160 fGpuSurface = win->makeGpuBackedSurface(attachmentInfo, fCurIntf, fC
urContext); |
| 152 glBindFramebuffer(GL_FRAMEBUFFER, fLayerFBO); | |
| 153 GrBackendRenderTargetDesc desc; | |
| 154 desc.fWidth = SkScalarRoundToInt(win->width()); | |
| 155 desc.fHeight = SkScalarRoundToInt(win->height()); | |
| 156 desc.fConfig = kSkia8888_GrPixelConfig; | |
| 157 desc.fRenderTargetHandle = fLayerFBO; | |
| 158 desc.fSampleCnt = info.fSampleCount; | |
| 159 desc.fStencilBits = info.fStencilBits; | |
| 160 | |
| 161 SkSafeUnref(fCurRenderTarget); | |
| 162 fCurRenderTarget = fCurContext->textureProvider()->wrapBackendRender
Target(desc); | |
| 163 } | 161 } |
| 164 #endif | 162 #endif |
| 165 } | 163 } |
| 166 | 164 |
| 167 GrContext* getGrContext() override { | 165 GrContext* getGrContext() override { |
| 168 #if SK_SUPPORT_GPU | 166 #if SK_SUPPORT_GPU |
| 169 return fCurContext; | 167 return fCurContext; |
| 170 #else | 168 #else |
| 171 return NULL; | 169 return NULL; |
| 172 #endif | 170 #endif |
| 173 } | 171 } |
| 174 | |
| 175 GrRenderTarget* getGrRenderTarget() override { | |
| 176 #if SK_SUPPORT_GPU | |
| 177 return fCurRenderTarget; | |
| 178 #else | |
| 179 return NULL; | |
| 180 #endif | |
| 181 } | |
| 182 | 172 |
| 173 int numColorSamples() const override { |
| 174 #if SK_SUPPORT_GPU |
| 175 return fMSAASampleCount; |
| 176 #else |
| 177 return 0; |
| 178 #endif |
| 179 } |
| 180 |
| 183 int getColorBits() override { | 181 int getColorBits() override { |
| 182 #if SK_SUPPORT_GPU |
| 183 return fActualColorBits; |
| 184 #else |
| 184 return 24; | 185 return 24; |
| 186 #endif |
| 185 } | 187 } |
| 186 | 188 |
| 187 bool isUsingGL() const { return SkOSWindow::kNone_BackEndType != fBackend; } | 189 bool isUsingGL() const { return SkOSWindow::kNone_BackEndType != fBackend; } |
| 188 | 190 |
| 189 private: | 191 private: |
| 190 | 192 |
| 191 #if SK_SUPPORT_GPU | 193 #if SK_SUPPORT_GPU |
| 192 GrContext* fCurContext; | 194 GrContext* fCurContext; |
| 193 const GrGLInterface* fCurIntf; | 195 const GrGLInterface* fCurIntf; |
| 194 GrRenderTarget* fCurRenderTarget; | 196 sk_sp<SkSurface> fGpuSurface; |
| 195 int fMSAASampleCount; | 197 int fMSAASampleCount; |
| 196 GLint fLayerFBO; | 198 bool fDeepColor; |
| 199 int fActualColorBits; |
| 197 #endif | 200 #endif |
| 198 | 201 |
| 199 SkOSWindow::SkBackEndTypes fBackend; | 202 SkOSWindow::SkBackEndTypes fBackend; |
| 200 | 203 |
| 201 typedef SampleWindow::DeviceManager INHERITED; | 204 typedef SampleWindow::DeviceManager INHERITED; |
| 202 }; | 205 }; |
| 203 | 206 |
| 204 //////////////////////////////////////////////////////////////////////////////// | 207 //////////////////////////////////////////////////////////////////////////////// |
| 205 @implementation SkSampleUIView | 208 @implementation SkSampleUIView |
| 206 | 209 |
| (...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 412 glGetIntegerv(GL_SCISSOR_TEST, &scissorEnable); | 415 glGetIntegerv(GL_SCISSOR_TEST, &scissorEnable); |
| 413 glDisable(GL_SCISSOR_TEST); | 416 glDisable(GL_SCISSOR_TEST); |
| 414 glClearColor(0,0,0,0); | 417 glClearColor(0,0,0,0); |
| 415 glClear(GL_COLOR_BUFFER_BIT); | 418 glClear(GL_COLOR_BUFFER_BIT); |
| 416 if (scissorEnable) { | 419 if (scissorEnable) { |
| 417 glEnable(GL_SCISSOR_TEST); | 420 glEnable(GL_SCISSOR_TEST); |
| 418 } | 421 } |
| 419 glViewport(0, 0, fGL.fWidth, fGL.fHeight); | 422 glViewport(0, 0, fGL.fWidth, fGL.fHeight); |
| 420 | 423 |
| 421 | 424 |
| 422 SkAutoTUnref<SkSurface> surface(fWind->createSurface()); | 425 sk_sp<SkSurface> surface(fWind->makeSurface()); |
| 423 SkCanvas* canvas = surface->getCanvas(); | 426 SkCanvas* canvas = surface->getCanvas(); |
| 424 | 427 |
| 425 // if we're not "retained", then we have to always redraw everything. | 428 // if we're not "retained", then we have to always redraw everything. |
| 426 // This call forces us to ignore the fDirtyRgn, and draw everywhere. | 429 // This call forces us to ignore the fDirtyRgn, and draw everywhere. |
| 427 // If we are "retained", we can skip this call (as the raster case does) | 430 // If we are "retained", we can skip this call (as the raster case does) |
| 428 fWind->forceInvalAll(); | 431 fWind->forceInvalAll(); |
| 429 | 432 |
| 430 [self drawWithCanvas:canvas]; | 433 [self drawWithCanvas:canvas]; |
| 431 | 434 |
| 432 // This application only creates a single color renderbuffer which is alread
y bound at this point. | 435 // This application only creates a single color renderbuffer which is alread
y bound at this point. |
| 433 // This call is redundant, but needed if dealing with multiple renderbuffers
. | 436 // This call is redundant, but needed if dealing with multiple renderbuffers
. |
| 434 glBindRenderbuffer(GL_RENDERBUFFER, fGL.fRenderbuffer); | 437 glBindRenderbuffer(GL_RENDERBUFFER, fGL.fRenderbuffer); |
| 435 [fGL.fContext presentRenderbuffer:GL_RENDERBUFFER]; | 438 [fGL.fContext presentRenderbuffer:GL_RENDERBUFFER]; |
| 436 } | 439 } |
| 437 | 440 |
| 438 - (void)drawInRaster { | 441 - (void)drawInRaster { |
| 439 SkAutoTUnref<SkSurface> surface(fWind->createSurface()); | 442 sk_sp<SkSurface> surface(fWind->makeSurface()); |
| 440 SkCanvas* canvas = surface->getCanvas(); | 443 SkCanvas* canvas = surface->getCanvas(); |
| 441 [self drawWithCanvas:canvas]; | 444 [self drawWithCanvas:canvas]; |
| 442 CGImageRef cgimage = SkCreateCGImageRef(fWind->getBitmap()); | 445 CGImageRef cgimage = SkCreateCGImageRef(fWind->getBitmap()); |
| 443 fRasterLayer.contents = (id)cgimage; | 446 fRasterLayer.contents = (id)cgimage; |
| 444 CGImageRelease(cgimage); | 447 CGImageRelease(cgimage); |
| 445 } | 448 } |
| 446 | 449 |
| 447 - (void)forceRedraw { | 450 - (void)forceRedraw { |
| 448 if (fDevManager->isUsingGL()) | 451 if (fDevManager->isUsingGL()) |
| 449 [self drawInGL]; | 452 [self drawInGL]; |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 487 glBindRenderbuffer(GL_RENDERBUFFER, fGL.fRenderbuffer); | 490 glBindRenderbuffer(GL_RENDERBUFFER, fGL.fRenderbuffer); |
| 488 glGetRenderbufferParameteriv(GL_RENDERBUFFER, | 491 glGetRenderbufferParameteriv(GL_RENDERBUFFER, |
| 489 GL_RENDERBUFFER_STENCIL_SIZE, | 492 GL_RENDERBUFFER_STENCIL_SIZE, |
| 490 &info->fStencilBits); | 493 &info->fStencilBits); |
| 491 glGetRenderbufferParameteriv(GL_RENDERBUFFER, | 494 glGetRenderbufferParameteriv(GL_RENDERBUFFER, |
| 492 GL_RENDERBUFFER_SAMPLES_APPLE, | 495 GL_RENDERBUFFER_SAMPLES_APPLE, |
| 493 &info->fSampleCount); | 496 &info->fSampleCount); |
| 494 } | 497 } |
| 495 | 498 |
| 496 @end | 499 @end |
| OLD | NEW |