| /* |
| * Copyright 2016 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| // |
| // |
| // |
| |
| #include "SkSurface_Compute.h" |
| #include "SkDevice_Compute.h" |
| #include "SkImage_Compute.h" |
| |
| // |
| // |
| // |
| |
| #if SK_SUPPORT_GPU_COMPUTE |
| |
| // |
| // C++ |
| // |
| |
| #include "gl/GrGLGpu.h" |
| #include "SkSurface_Gpu.h" |
| |
| // |
| // |
| // |
| |
| SkSurface_Compute::SkSurface_Compute(sk_sp<SkContext_Compute> compute, |
| int const width, int const height) |
| : INHERITED(width,height,nullptr), |
| compute(compute) |
| { |
| // |
| // resize interop |
| // |
| // skc_interop_size_set(compute->interop,width,height,NULL); TODO skc.h |
| } |
| |
| SkSurface_Compute::~SkSurface_Compute() |
| { |
| ; |
| } |
| |
| // |
| // |
| // |
| |
| SkCanvas* |
| SkSurface_Compute::onNewCanvas() |
| { |
| uint32_t w = 0,h = 0; |
| |
| // skc_interop_size_get(compute->interop,&w,&h); TODO skc.h |
| |
| SkDevice_Compute * const device_compute = new SkDevice_Compute(compute,w,h); |
| SkCanvas * const canvas = new SkCanvas(device_compute,SkCanvas::kConservativeRasterClip_InitFlag); |
| |
| // |
| // destroy device upon surface destruction |
| // |
| device = sk_sp<SkBaseDevice>(device_compute); |
| |
| // |
| // move origin from upper left to lower left |
| // |
| SkMatrix matrix; |
| |
| matrix.setScaleTranslate(1.0f,-1.0f,0.0f,(SkScalar)h); |
| |
| canvas->setMatrix(matrix); |
| |
| return canvas; |
| } |
| |
| // |
| // |
| // |
| |
| sk_sp<SkSurface> |
| SkSurface_Compute::onNewSurface(const SkImageInfo& info) |
| { |
| return sk_make_sp<SkSurface_Compute>(compute,info.width(),info.height()); |
| } |
| |
| // |
| // |
| // |
| |
| sk_sp<SkImage> |
| SkSurface_Compute::onNewImageSnapshot() |
| { |
| uint32_t w,h; |
| |
| // skc_interop_size_get(compute->interop,&w,&h); TODO skc.h |
| |
| GrGLuint snap; |
| |
| // skc_interop_snap_create(compute->interop, TODO skc.h |
| // skc_surface_interop_surface_get(compute->surface), |
| // &snap); |
| |
| return sk_make_sp<SkImage_Compute>(compute,snap,w,h); |
| } |
| |
| // |
| // |
| // |
| |
| void |
| SkSurface_Compute::onCopyOnWrite(ContentChangeMode mode) |
| { |
| ; |
| } |
| |
| // |
| // |
| // |
| |
| #if 0 |
| |
| sk_sp<SkSurface> |
| SkSurface_Compute::MakeComputeBackedSurface(SkWindow * const window, |
| const SkWindow::AttachmentInfo & attachmentInfo, |
| GrGLInterface const * const grInterface, |
| GrContext * const grContext, |
| sk_sp<SkContext_Compute> compute) |
| { |
| GrBackendRenderTargetDesc desc; |
| |
| desc.fWidth = SkScalarRoundToInt(window->width()); |
| desc.fHeight = SkScalarRoundToInt(window->height()); |
| |
| if (0 == desc.fWidth || 0 == desc.fHeight) { |
| return nullptr; |
| } |
| |
| // TODO: Query the actual framebuffer for sRGB capable. However, to |
| // preserve old (fake-linear) behavior, we don't do this. Instead, rely |
| // on the flag (currently driven via 'C' mode in SampleApp). |
| // |
| // Also, we may not have real sRGB support (ANGLE, in particular), so check for |
| // that, and fall back to L32: |
| // |
| // ... and, if we're using a 10-bit/channel FB0, it doesn't do sRGB conversion on write, |
| // so pretend that it's non-sRGB 8888: |
| desc.fConfig = |
| grContext->caps()->srgbSupport() && |
| SkImageInfoIsGammaCorrect(window->info()) && |
| (attachmentInfo.fColorBits != 30) |
| ? kSkiaGamma8888_GrPixelConfig : kSkia8888_GrPixelConfig; |
| |
| desc.fOrigin = kBottomLeft_GrSurfaceOrigin; |
| desc.fSampleCnt = 0; // attachmentInfo.fSampleCount; |
| desc.fStencilBits = 0; // attachmentInfo.fStencilBits; |
| |
| GrGLint buffer; |
| |
| GR_GL_GetIntegerv(grInterface,GR_GL_FRAMEBUFFER_BINDING,&buffer); |
| desc.fRenderTargetHandle = buffer; |
| |
| sk_sp<SkColorSpace> colorSpace = |
| grContext->caps()->srgbSupport() && SkImageInfoIsGammaCorrect(window->info()) |
| ? SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named) : nullptr; |
| |
| // |
| // |
| // |
| |
| if (!grContext) { |
| return nullptr; |
| } |
| |
| if (!SkSurface_Gpu::Valid(grContext,desc.fConfig,colorSpace.get())) { |
| return nullptr; |
| } |
| |
| return sk_make_sp<SkSurface_Compute>(compute,desc.fWidth,desc.fHeight); |
| } |
| |
| #endif |
| |
| // |
| // |
| // |
| |
| #endif |