/* * 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