7bfc9139c6
This also makes the isTexturable that takes a color explicitly called isFormatTexturableAndUploadable. A lot of the uses of isConfigTexturable were changed to the Uploadable version of the check, even though this is not where we want to land in the long run. In the long run the uploadability will be checked via calls to supportedWritePixelsColorType and all the isTexturable calls should purely be about texturing. However, until those changes land we keep it safe and keep the same functionality that isConfigTexturable had by checking uploadability as well. Bug: skia:6718 Change-Id: I3563f33f49811923da80e676fa3036ae46c4da70 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/234323 Reviewed-by: Brian Salomon <bsalomon@google.com> Commit-Queue: Greg Daniel <egdaniel@google.com>
87 lines
3.1 KiB
C++
87 lines
3.1 KiB
C++
/*
|
|
* Copyright 2018 Google Inc.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*/
|
|
|
|
#include "include/gpu/GrBackendSurface.h"
|
|
#include "src/gpu/GrContextPriv.h"
|
|
#include "src/gpu/GrDrawingManager.h"
|
|
#include "src/gpu/GrGpu.h"
|
|
#include "src/gpu/GrProxyProvider.h"
|
|
#include "src/gpu/SkGr.h"
|
|
#include "tools/gpu/ProxyUtils.h"
|
|
|
|
namespace sk_gpu_test {
|
|
|
|
sk_sp<GrTextureProxy> MakeTextureProxyFromData(GrContext* context,
|
|
GrRenderable renderable,
|
|
int width,
|
|
int height,
|
|
GrColorType colorType, SkAlphaType alphaType,
|
|
GrSurfaceOrigin origin,
|
|
const void* data, size_t rowBytes) {
|
|
if (context->priv().abandoned()) {
|
|
return nullptr;
|
|
}
|
|
|
|
const GrCaps* caps = context->priv().caps();
|
|
|
|
const GrBackendFormat format = caps->getDefaultBackendFormat(colorType, renderable);
|
|
if (!format.isValid()) {
|
|
return nullptr;
|
|
}
|
|
|
|
sk_sp<GrTextureProxy> proxy;
|
|
if (kBottomLeft_GrSurfaceOrigin == origin) {
|
|
// We (soon will) only support using kBottomLeft with wrapped textures.
|
|
auto backendTex = context->createBackendTexture(
|
|
width, height, format, SkColors::kTransparent, GrMipMapped::kNo, renderable,
|
|
GrProtected::kNo);
|
|
if (!backendTex.isValid()) {
|
|
return nullptr;
|
|
}
|
|
|
|
// Adopt ownership so our caller doesn't have to worry about deleting the backend texture.
|
|
if (GrRenderable::kYes == renderable) {
|
|
proxy = context->priv().proxyProvider()->wrapRenderableBackendTexture(
|
|
backendTex, origin, 1, colorType, kAdopt_GrWrapOwnership, GrWrapCacheable::kNo,
|
|
nullptr, nullptr);
|
|
} else {
|
|
proxy = context->priv().proxyProvider()->wrapBackendTexture(
|
|
backendTex, colorType, origin, kAdopt_GrWrapOwnership,
|
|
GrWrapCacheable::kNo, kRW_GrIOType);
|
|
}
|
|
|
|
if (!proxy) {
|
|
context->deleteBackendTexture(backendTex);
|
|
return nullptr;
|
|
}
|
|
|
|
} else {
|
|
GrSurfaceDesc desc;
|
|
desc.fConfig = GrColorTypeToPixelConfig(colorType);
|
|
desc.fWidth = width;
|
|
desc.fHeight = height;
|
|
proxy = context->priv().proxyProvider()->createProxy(format, desc, renderable, 1, origin,
|
|
SkBackingFit::kExact, SkBudgeted::kYes,
|
|
GrProtected::kNo);
|
|
if (!proxy) {
|
|
return nullptr;
|
|
}
|
|
}
|
|
|
|
auto sContext = context->priv().makeWrappedSurfaceContext(proxy, colorType, alphaType, nullptr);
|
|
if (!sContext) {
|
|
return nullptr;
|
|
}
|
|
if (!sContext->writePixels({colorType, alphaType, nullptr, width, height}, data, rowBytes,
|
|
{0, 0}, context)) {
|
|
return nullptr;
|
|
}
|
|
return proxy;
|
|
}
|
|
|
|
} // namespace sk_gpu_test
|