When querying mipmapped on proxies return targets state if possible
In the non-ddl world where we are still using lazy proxies, we may create those proxies with no mipmaps, but when we instantiate them immediately we end up getting a surface with mips. This allows future queries on that proxy to take advatage of the fact that we actaully have mips. For lazy ddl proxies, this makes it work in a world where we may decide to uninstantiate the proxies and we continue to track the request mip level as well as the actually one from instantiation. Bug: skia: Change-Id: I4824e74d5e2a2fdf860709c85469aa8cf74632d5 Reviewed-on: https://skia-review.googlesource.com/106121 Commit-Queue: Greg Daniel <egdaniel@google.com> Reviewed-by: Brian Salomon <bsalomon@google.com> Reviewed-by: Robert Phillips <robertphillips@google.com>
This commit is contained in:
parent
1fabd51f58
commit
3b2ebbb2d4
@ -29,7 +29,12 @@ public:
|
|||||||
|
|
||||||
GrSamplerState::Filter highestFilterMode() const;
|
GrSamplerState::Filter highestFilterMode() const;
|
||||||
|
|
||||||
GrMipMapped mipMapped() const { return fMipMapped; }
|
// If we are instantiated and have a target, return the mip state of that target. Otherwise
|
||||||
|
// returns the proxy's mip state from creation time. This is useful for lazy proxies which may
|
||||||
|
// claim to not need mips at creation time, but the instantiation happens to give us a mipped
|
||||||
|
// target. In that case we should use that for our benefit to avoid possible copies/mip
|
||||||
|
// generation later.
|
||||||
|
GrMipMapped mipMapped() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the texture proxy's unique key. It will be invalid if the proxy doesn't have one.
|
* Return the texture proxy's unique key. It will be invalid if the proxy doesn't have one.
|
||||||
|
@ -118,9 +118,16 @@ GrSamplerState::Filter GrTextureProxy::highestFilterMode() const {
|
|||||||
return GrSamplerState::Filter::kMipMap;
|
return GrSamplerState::Filter::kMipMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GrMipMapped GrTextureProxy::mipMapped() const {
|
||||||
|
if (this->priv().isInstantiated()) {
|
||||||
|
return this->priv().peekTexture()->texturePriv().mipMapped();
|
||||||
|
}
|
||||||
|
return fMipMapped;
|
||||||
|
}
|
||||||
|
|
||||||
size_t GrTextureProxy::onUninstantiatedGpuMemorySize() const {
|
size_t GrTextureProxy::onUninstantiatedGpuMemorySize() const {
|
||||||
return GrSurface::ComputeSize(this->config(), this->width(), this->height(), 1,
|
return GrSurface::ComputeSize(this->config(), this->width(), this->height(), 1,
|
||||||
this->mipMapped(), !this->priv().isExact());
|
this->texPriv().proxyMipMapped(), !this->priv().isExact());
|
||||||
}
|
}
|
||||||
|
|
||||||
void GrTextureProxy::setUniqueKey(GrProxyProvider* proxyProvider, const GrUniqueKey& key) {
|
void GrTextureProxy::setUniqueKey(GrProxyProvider* proxyProvider, const GrUniqueKey& key) {
|
||||||
@ -149,7 +156,7 @@ void GrTextureProxy::validateLazySurface(const GrSurface* surface) {
|
|||||||
|
|
||||||
// Anything that is checked here should be duplicated in GrTextureRenderTargetProxy's version
|
// Anything that is checked here should be duplicated in GrTextureRenderTargetProxy's version
|
||||||
SkASSERT(surface->asTexture());
|
SkASSERT(surface->asTexture());
|
||||||
SkASSERT(GrMipMapped::kNo == this->mipMapped() ||
|
SkASSERT(GrMipMapped::kNo == this->texPriv().proxyMipMapped() ||
|
||||||
GrMipMapped::kYes == surface->asTexture()->texturePriv().mipMapped());
|
GrMipMapped::kYes == surface->asTexture()->texturePriv().mipMapped());
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -27,6 +27,9 @@ public:
|
|||||||
// Clears any deferred uploader object on the proxy. Used to free the CPU data after the
|
// Clears any deferred uploader object on the proxy. Used to free the CPU data after the
|
||||||
// contents have been uploaded.
|
// contents have been uploaded.
|
||||||
void resetDeferredUploader();
|
void resetDeferredUploader();
|
||||||
|
// Returns the GrMipMapped value of the proxy from creation time regardless of whether it has
|
||||||
|
// been instantiated or not.
|
||||||
|
GrMipMapped proxyMipMapped() const { return fTextureProxy->fMipMapped; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
explicit GrTextureProxyPriv(GrTextureProxy* textureProxy) : fTextureProxy(textureProxy) {}
|
explicit GrTextureProxyPriv(GrTextureProxy* textureProxy) : fTextureProxy(textureProxy) {}
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#include "GrCaps.h"
|
#include "GrCaps.h"
|
||||||
#include "GrTexture.h"
|
#include "GrTexture.h"
|
||||||
#include "GrTexturePriv.h"
|
#include "GrTexturePriv.h"
|
||||||
|
#include "GrTextureProxyPriv.h"
|
||||||
#include "GrRenderTarget.h"
|
#include "GrRenderTarget.h"
|
||||||
#include "GrSurfaceProxyPriv.h"
|
#include "GrSurfaceProxyPriv.h"
|
||||||
|
|
||||||
@ -63,7 +64,8 @@ size_t GrTextureRenderTargetProxy::onUninstantiatedGpuMemorySize() const {
|
|||||||
|
|
||||||
// TODO: do we have enough information to improve this worst case estimate?
|
// TODO: do we have enough information to improve this worst case estimate?
|
||||||
return GrSurface::ComputeSize(this->config(), this->width(), this->height(),
|
return GrSurface::ComputeSize(this->config(), this->width(), this->height(),
|
||||||
colorSamplesPerPixel, this->mipMapped(), !this->priv().isExact());
|
colorSamplesPerPixel, this->texPriv().proxyMipMapped(),
|
||||||
|
!this->priv().isExact());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GrTextureRenderTargetProxy::instantiate(GrResourceProvider* resourceProvider) {
|
bool GrTextureRenderTargetProxy::instantiate(GrResourceProvider* resourceProvider) {
|
||||||
@ -109,7 +111,7 @@ sk_sp<GrSurface> GrTextureRenderTargetProxy::createSurface(
|
|||||||
void GrTextureRenderTargetProxy::validateLazySurface(const GrSurface* surface) {
|
void GrTextureRenderTargetProxy::validateLazySurface(const GrSurface* surface) {
|
||||||
// Anything checked here should also be checking the GrTextureProxy version
|
// Anything checked here should also be checking the GrTextureProxy version
|
||||||
SkASSERT(surface->asTexture());
|
SkASSERT(surface->asTexture());
|
||||||
SkASSERT(GrMipMapped::kNo == this->mipMapped() ||
|
SkASSERT(GrMipMapped::kNo == this->texPriv().proxyMipMapped() ||
|
||||||
GrMipMapped::kYes == surface->asTexture()->texturePriv().mipMapped());
|
GrMipMapped::kYes == surface->asTexture()->texturePriv().mipMapped());
|
||||||
|
|
||||||
// Anything checked here should also be checking the GrRenderTargetProxy version
|
// Anything checked here should also be checking the GrRenderTargetProxy version
|
||||||
|
Loading…
Reference in New Issue
Block a user