sk_sp<SkSurface> SkSurface::MakeFromBackendTextureAsRenderTarget(GrContext* context, const GrBackendTexture& tex, GrSurfaceOrigin origin, int sampleCnt, sk_sp<SkColorSpace> colorSpace, const SkSurfaceProps* props) { if (!context) { return nullptr; } if (!SkSurface_Gpu::Valid(context, tex.config(), colorSpace.get())) { return nullptr; } sampleCnt = SkTMax(1, sampleCnt); sk_sp<GrRenderTargetContext> rtc( context->contextPriv().makeBackendTextureAsRenderTargetRenderTargetContext( tex, origin, sampleCnt, std::move(colorSpace), props)); if (!rtc) { return nullptr; } sk_sp<SkGpuDevice> device(SkGpuDevice::Make(context, std::move(rtc), tex.width(), tex.height(), SkGpuDevice::kUninit_InitContents)); if (!device) { return nullptr; } return sk_make_sp<SkSurface_Gpu>(std::move(device)); }
sk_sp<GrRenderTarget> GrGpu::wrapBackendTextureAsRenderTarget(const GrBackendTexture& tex, int sampleCnt) { if (0 == this->caps()->getRenderTargetSampleCount(sampleCnt, tex.config())) { return nullptr; } int maxSize = this->caps()->maxTextureSize(); if (tex.width() > maxSize || tex.height() > maxSize) { return nullptr; } this->handleDirtyContext(); return this->onWrapBackendTextureAsRenderTarget(tex, sampleCnt); }
sk_sp<GrTexture> GrMockGpu::onWrapBackendTexture(const GrBackendTexture& tex, GrWrapOwnership ownership, GrWrapCacheable wrapType, GrIOType ioType) { GrSurfaceDesc desc; desc.fWidth = tex.width(); desc.fHeight = tex.height(); GrMockTextureInfo info; SkAssertResult(tex.getMockTextureInfo(&info)); desc.fConfig = info.fConfig; GrMipMapsStatus mipMapsStatus = tex.hasMipMaps() ? GrMipMapsStatus::kValid : GrMipMapsStatus::kNotAllocated; return sk_sp<GrTexture>(new GrMockTexture(this, desc, mipMapsStatus, info, wrapType, ioType)); }
sk_sp<GrTexture> GrGpu::wrapBackendTexture(const GrBackendTexture& backendTex, GrWrapOwnership ownership) { this->handleDirtyContext(); if (!this->caps()->isConfigTexturable(backendTex.config())) { return nullptr; } if (backendTex.width() > this->caps()->maxTextureSize() || backendTex.height() > this->caps()->maxTextureSize()) { return nullptr; } sk_sp<GrTexture> tex = this->onWrapBackendTexture(backendTex, ownership); if (tex && !backendTex.hasMipMaps()) { // Ganesh will not ever allocate mipmaps for a wrapped resource. By setting this flag here, // it will be propagated to any proxy that wraps this texture. tex->texturePriv().setDoesNotSupportMipMaps(); } return tex; }
sk_sp<GrRenderTarget> GrMockGpu::onWrapBackendTextureAsRenderTarget(const GrBackendTexture& tex, int sampleCnt) { GrSurfaceDesc desc; desc.fFlags = kRenderTarget_GrSurfaceFlag; desc.fWidth = tex.width(); desc.fHeight = tex.height(); GrMockTextureInfo texInfo; SkAssertResult(tex.getMockTextureInfo(&texInfo)); desc.fConfig = texInfo.fConfig; desc.fSampleCnt = sampleCnt; GrMockRenderTargetInfo rtInfo; rtInfo.fConfig = texInfo.fConfig; // The client gave us the texture ID but we supply the render target ID. rtInfo.fID = NextInternalRenderTargetID(); return sk_sp<GrRenderTarget>( new GrMockRenderTarget(this, GrMockRenderTarget::kWrapped, desc, rtInfo)); }
sk_sp<GrTexture> GrMockGpu::onWrapRenderableBackendTexture(const GrBackendTexture& tex, int sampleCnt, GrWrapOwnership ownership) { GrSurfaceDesc desc; desc.fFlags = kRenderTarget_GrSurfaceFlag; desc.fWidth = tex.width(); desc.fHeight = tex.height(); GrMockTextureInfo texInfo; SkAssertResult(tex.getMockTextureInfo(&texInfo)); desc.fConfig = texInfo.fConfig; GrMipMapsStatus mipMapsStatus = tex.hasMipMaps() ? GrMipMapsStatus::kValid : GrMipMapsStatus::kNotAllocated; GrMockRenderTargetInfo rtInfo; rtInfo.fConfig = texInfo.fConfig; // The client gave us the texture ID but we supply the render target ID. rtInfo.fID = NextInternalRenderTargetID(); return sk_sp<GrTexture>( new GrMockTextureRenderTarget(this, desc, mipMapsStatus, texInfo, rtInfo)); }
sk_sp<GrTexture> GrGpu::wrapRenderableBackendTexture(const GrBackendTexture& backendTex, int sampleCnt, GrWrapOwnership ownership) { this->handleDirtyContext(); if (sampleCnt < 1) { return nullptr; } if (!this->caps()->isConfigTexturable(backendTex.config()) || !this->caps()->getRenderTargetSampleCount(sampleCnt, backendTex.config())) { return nullptr; } if (backendTex.width() > this->caps()->maxRenderTargetSize() || backendTex.height() > this->caps()->maxRenderTargetSize()) { return nullptr; } sk_sp<GrTexture> tex = this->onWrapRenderableBackendTexture(backendTex, sampleCnt, ownership); if (tex && !backendTex.hasMipMaps()) { // Ganesh will not ever allocate mipmaps for a wrapped resource. By setting this flag here, // it will be propagated to any proxy that wraps this texture. tex->texturePriv().setDoesNotSupportMipMaps(); } SkASSERT(!tex || tex->asRenderTarget()); return tex; }