[graphite] Implement onAsView for Image_Raster

Bug: skia:12845
Change-Id: I46e37ae0c1a8b0587aee3eb9e8cad728d8f61783
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/520738
Reviewed-by: Robert Phillips <robertphillips@google.com>
Commit-Queue: Jim Van Verth <jvanverth@google.com>
This commit is contained in:
Jim Van Verth 2022-03-17 14:47:18 -04:00 committed by SkCQ
parent ac8c554dbe
commit c5d130aac0
2 changed files with 107 additions and 11 deletions

View File

@ -17,6 +17,7 @@
#include "experimental/graphite/src/Texture.h" #include "experimental/graphite/src/Texture.h"
#include "experimental/graphite/src/TextureProxy.h" #include "experimental/graphite/src/TextureProxy.h"
#include "src/core/SkConvertPixels.h" #include "src/core/SkConvertPixels.h"
#include "src/core/SkTraceEvent.h"
namespace skgpu { namespace skgpu {
@ -137,6 +138,10 @@ UploadInstance UploadInstance::Make(Recorder* recorder,
buffer->unmap(); buffer->unmap();
ATRACE_ANDROID_FRAMEWORK("Upload %sTexture [%ux%u]",
mipLevelCount > 1 ? "MipMap " : "",
dstRect.width(), dstRect.height());
return {std::move(buffer), std::move(textureProxy), std::move(copyData)}; return {std::move(buffer), std::move(textureProxy), std::move(copyData)};
} }

View File

@ -24,14 +24,17 @@
#include "src/gpu/SkGr.h" #include "src/gpu/SkGr.h"
#include "src/gpu/effects/GrBicubicEffect.h" #include "src/gpu/effects/GrBicubicEffect.h"
#include "src/gpu/effects/GrTextureEffect.h" #include "src/gpu/effects/GrTextureEffect.h"
#endif
#ifdef SK_GRAPHITE_ENABLED #ifdef SK_GRAPHITE_ENABLED
namespace skgpu { #include "experimental/graphite/include/GraphiteTypes.h"
enum class Mipmapped : bool; #include "experimental/graphite/include/Recorder.h"
class Recorder; #include "experimental/graphite/src/Buffer.h"
class TextureProxyView; #include "experimental/graphite/src/Caps.h"
} #include "experimental/graphite/src/CommandBuffer.h"
#endif #include "experimental/graphite/src/RecorderPriv.h"
#include "experimental/graphite/src/TextureProxyView.h"
#include "experimental/graphite/src/UploadTask.h"
#endif #endif
// fixes https://bug.skia.org/5096 // fixes https://bug.skia.org/5096
@ -475,10 +478,98 @@ std::unique_ptr<GrFragmentProcessor> SkImage_Raster::onAsFragmentProcessor(
#endif #endif
#ifdef SK_GRAPHITE_ENABLED #ifdef SK_GRAPHITE_ENABLED
std::tuple<skgpu::TextureProxyView, SkColorType> SkImage_Raster::onAsView( // Based on Ganesh, we may need to use this in more than one place,
skgpu::Recorder*, // so pulling it out to make it more modular before finding it a home.
skgpu::Mipmapped, std::tuple<skgpu::TextureProxyView, SkColorType> make_bitmap_proxy_view(skgpu::Recorder* recorder,
SkBudgeted) const { const SkBitmap& bitmap,
return {}; // TODO skgpu::Mipmapped mipmapped,
SkBudgeted budgeted) {
// Adjust params based on input and Caps
const skgpu::Caps* caps = recorder->priv().caps();
SkColorType ct = bitmap.info().colorType();
if (bitmap.dimensions().area() <= 1) {
mipmapped = skgpu::Mipmapped::kNo;
} }
int mipLevelCount = (mipmapped == skgpu::Mipmapped::kYes) ?
SkMipmap::ComputeLevelCount(bitmap.width(), bitmap.height()) + 1 : 1;
auto textureInfo = caps->getDefaultSampledTextureInfo(ct, mipLevelCount, skgpu::Protected::kNo,
skgpu::Renderable::kNo);
if (!textureInfo.isValid()) {
ct = kRGBA_8888_SkColorType;
textureInfo = caps->getDefaultSampledTextureInfo(ct, mipLevelCount, skgpu::Protected::kNo,
skgpu::Renderable::kNo);
}
SkASSERT(textureInfo.isValid());
// Convert bitmap to texture colortype if necessary
SkBitmap bmpToUpload;
if (ct != bitmap.info().colorType()) {
if (!bmpToUpload.tryAllocPixels(bitmap.info().makeColorType(ct)) ||
!bitmap.readPixels(bmpToUpload.pixmap())) {
return {};
}
bmpToUpload.setImmutable();
} else {
bmpToUpload = bitmap;
}
if (!SkImageInfoIsValid(bmpToUpload.info())) {
return {};
}
// setup MipLevels
std::vector<skgpu::MipLevel> texels;
if (mipLevelCount == 1) {
texels.resize(mipLevelCount);
texels[0].fPixels = bitmap.getPixels();
texels[0].fRowBytes = bitmap.rowBytes();
} else {
sk_sp<SkMipmap> mipmaps(SkMipmap::Build(bitmap.pixmap(), nullptr));
if (!mipmaps) {
return {};
}
SkASSERT(mipLevelCount == mipmaps->countLevels() + 1);
texels.resize(mipLevelCount);
texels[0].fPixels = bitmap.getPixels();
texels[0].fRowBytes = bitmap.rowBytes();
for (int i = 1; i < mipLevelCount; ++i) {
SkMipmap::Level generatedMipLevel;
mipmaps->getLevel(i - 1, &generatedMipLevel);
texels[i].fPixels = generatedMipLevel.fPixmap.addr();
texels[i].fRowBytes = generatedMipLevel.fPixmap.rowBytes();
SkASSERT(texels[i].fPixels);
SkASSERT(generatedMipLevel.fPixmap.colorType() == bitmap.colorType());
}
}
// Create proxy
sk_sp<skgpu::TextureProxy> proxy(new skgpu::TextureProxy(bitmap.dimensions(), textureInfo));
if (!proxy) {
return {};
}
SkASSERT(caps->areColorTypeAndTextureInfoCompatible(ct, proxy->textureInfo()));
SkASSERT(mipmapped == skgpu::Mipmapped::kNo || proxy->mipmapped() == skgpu::Mipmapped::kYes);
// Add UploadTask to Recorder
skgpu::UploadInstance upload = skgpu::UploadInstance::Make(
recorder, proxy, ct, texels, SkIRect::MakeSize(bitmap.dimensions()));
recorder->priv().add(skgpu::UploadTask::Make(upload));
// TODO: get readSwizzle from caps
skgpu::Swizzle swizzle = skgpu::Swizzle::RGBA();
return {{std::move(proxy), swizzle}, ct};
}
std::tuple<skgpu::TextureProxyView, SkColorType> SkImage_Raster::onAsView(
skgpu::Recorder* recorder,
skgpu::Mipmapped mipmapped,
SkBudgeted budgeted) const {
return make_bitmap_proxy_view(recorder, fBitmap, mipmapped, budgeted);
}
#endif #endif