Merge "Fix TextureView texture filtering."

This commit is contained in:
Chris Craik
2014-02-27 22:20:31 +00:00
committed by Android (Google) Code Review
6 changed files with 31 additions and 5 deletions

View File

@@ -112,6 +112,15 @@ void DeferredLayerUpdater::doUpdateTexImage() {
frameNumber = newFrameNumber;
dropCounter++;
}
bool forceFilter = false;
sp<GraphicBuffer> buffer = mSurfaceTexture->getCurrentBuffer();
if (buffer != NULL) {
// force filtration if buffer size != layer size
forceFilter = mWidth != buffer->getWidth()
|| mHeight != buffer->getHeight();
}
#if DEBUG_RENDERER
if (dropCounter > 0) {
RENDERER_LOGD("Dropped %d frames on texture layer update", dropCounter);
@@ -120,8 +129,8 @@ void DeferredLayerUpdater::doUpdateTexImage() {
mSurfaceTexture->getTransformMatrix(transform);
GLenum renderTarget = mSurfaceTexture->getCurrentTextureTarget();
LayerRenderer::updateTextureLayer(mLayer, mWidth, mHeight, !mBlend,
renderTarget, transform);
LayerRenderer::updateTextureLayer(mLayer, mWidth, mHeight,
!mBlend, forceFilter, renderTarget, transform);
}
}

View File

@@ -46,6 +46,7 @@ Layer::Layer(const uint32_t layerWidth, const uint32_t layerHeight):
stencil = NULL;
debugDrawUpdate = false;
hasDrawnSinceUpdate = false;
forceFilter = false;
deferredList = NULL;
caches.resourceCache.incrementRefcount(this);
}

View File

@@ -127,6 +127,14 @@ public:
return texture.blend;
}
inline void setForceFilter(bool forceFilter) {
this->forceFilter = forceFilter;
}
inline bool getForceFilter() const {
return forceFilter;
}
inline void setAlpha(int alpha) {
this->alpha = alpha;
}
@@ -342,10 +350,16 @@ private:
*/
SkColorFilter* colorFilter;
/**
* Indicates raster data backing the layer is scaled, requiring filtration.
*/
bool forceFilter;
/**
* Opacity of the layer.
*/
int alpha;
/**
* Blending mode of the layer.
*/

View File

@@ -290,14 +290,15 @@ Layer* LayerRenderer::createTextureLayer() {
}
void LayerRenderer::updateTextureLayer(Layer* layer, uint32_t width, uint32_t height,
bool isOpaque, GLenum renderTarget, float* transform) {
bool isOpaque, bool forceFilter, GLenum renderTarget, float* textureTransform) {
if (layer) {
layer->setBlend(!isOpaque);
layer->setForceFilter(forceFilter);
layer->setSize(width, height);
layer->layer.set(0.0f, 0.0f, width, height);
layer->region.set(width, height);
layer->regionRect.set(0.0f, 0.0f, width, height);
layer->getTexTransform().load(transform);
layer->getTexTransform().load(textureTransform);
if (renderTarget != layer->getRenderTarget()) {
layer->setRenderTarget(renderTarget);

View File

@@ -56,7 +56,7 @@ public:
ANDROID_API static Layer* createRenderLayer(uint32_t width, uint32_t height);
ANDROID_API static bool resizeLayer(Layer* layer, uint32_t width, uint32_t height);
ANDROID_API static void updateTextureLayer(Layer* layer, uint32_t width, uint32_t height,
bool isOpaque, GLenum renderTarget, float* transform);
bool isOpaque, bool forceFilter, GLenum renderTarget, float* textureTransform);
ANDROID_API static void destroyLayer(Layer* layer);
ANDROID_API static void destroyLayerDeferred(Layer* layer);
ANDROID_API static bool copyLayer(Layer* layer, SkBitmap* bitmap);

View File

@@ -1068,6 +1068,7 @@ void OpenGLRenderer::drawTextureLayer(Layer* layer, const Rect& rect) {
setupDrawExternalTexture(layer->getTexture());
}
if (currentTransform()->isPureTranslate() &&
!layer->getForceFilter() &&
layer->getWidth() == (uint32_t) rect.getWidth() &&
layer->getHeight() == (uint32_t) rect.getHeight()) {
const float x = (int) floorf(rect.left + currentTransform()->getTranslateX() + 0.5f);