Merge "Always flush renderstate in DeferredLayerUpdater::apply"

This commit is contained in:
Chris Craik
2017-02-15 19:10:03 +00:00
committed by Android (Google) Code Review
6 changed files with 27 additions and 36 deletions

View File

@@ -98,6 +98,8 @@ void DeferredLayerUpdater::apply() {
mUpdateTexImage = false;
doUpdateTexImage();
}
GLenum renderTarget = mSurfaceTexture->getCurrentTextureTarget();
static_cast<GlLayer*>(mLayer)->setRenderTarget(renderTarget);
}
if (mTransform) {
mLayer->getTransform().load(*mTransform);
@@ -140,12 +142,8 @@ void DeferredLayerUpdater::doUpdateTexImage() {
}
#endif
mSurfaceTexture->getTransformMatrix(transform);
GLenum renderTarget = mSurfaceTexture->getCurrentTextureTarget();
LOG_ALWAYS_FATAL_IF(renderTarget != GL_TEXTURE_2D && renderTarget != GL_TEXTURE_EXTERNAL_OES,
"doUpdateTexImage target %x, 2d %x, EXT %x",
renderTarget, GL_TEXTURE_2D, GL_TEXTURE_EXTERNAL_OES);
updateLayer(forceFilter, renderTarget, transform);
updateLayer(forceFilter, transform);
}
}
@@ -155,28 +153,17 @@ void DeferredLayerUpdater::doUpdateVkTexImage() {
mLayer->getApi(), Layer::Api::OpenGL, Layer::Api::Vulkan);
static const mat4 identityMatrix;
updateLayer(false, GL_NONE, identityMatrix.data);
updateLayer(false, identityMatrix.data);
VkLayer* vkLayer = static_cast<VkLayer*>(mLayer);
vkLayer->updateTexture();
}
void DeferredLayerUpdater::updateLayer(bool forceFilter, GLenum renderTarget,
const float* textureTransform) {
void DeferredLayerUpdater::updateLayer(bool forceFilter, const float* textureTransform) {
mLayer->setBlend(mBlend);
mLayer->setForceFilter(forceFilter);
mLayer->setSize(mWidth, mHeight);
mLayer->getTexTransform().load(textureTransform);
if (mLayer->getApi() == Layer::Api::OpenGL) {
GlLayer* glLayer = static_cast<GlLayer*>(mLayer);
if (renderTarget != glLayer->getRenderTarget()) {
glLayer->setRenderTarget(renderTarget);
glLayer->bindTexture();
glLayer->setFilter(GL_NEAREST, false, true);
glLayer->setWrap(GL_CLAMP_TO_EDGE, false, true);
}
}
}
void DeferredLayerUpdater::detachSurfaceTexture() {

View File

@@ -101,7 +101,7 @@ public:
void detachSurfaceTexture();
void updateLayer(bool forceFilter, GLenum renderTarget, const float* textureTransform);
void updateLayer(bool forceFilter, const float* textureTransform);
void destroyLayer();

View File

@@ -55,9 +55,15 @@ void GlLayer::onGlContextLost() {
texture.deleteTexture();
}
void GlLayer::bindTexture() const {
if (texture.mId) {
caches.textureState().bindTexture(texture.target(), texture.mId);
void GlLayer::setRenderTarget(GLenum renderTarget) {
if (renderTarget != getRenderTarget()) {
// new render target: bind with new target, and update filter/wrap
texture.mTarget = renderTarget;
if (texture.mId) {
caches.textureState().bindTexture(texture.target(), texture.mId);
}
texture.setFilter(GL_NEAREST, false, true);
texture.setWrap(GL_CLAMP_TO_EDGE, false, true);
}
}

View File

@@ -68,23 +68,12 @@ public:
return texture.target();
}
inline void setRenderTarget(GLenum renderTarget) {
texture.mTarget = renderTarget;
}
inline bool isRenderable() const {
return texture.target() != GL_NONE;
}
void setWrap(GLenum wrap, bool bindTexture = false, bool force = false) {
texture.setWrap(wrap, bindTexture, force);
}
void setRenderTarget(GLenum renderTarget);
void setFilter(GLenum filter, bool bindTexture = false, bool force = false) {
texture.setFilter(filter, bindTexture, force);
}
void bindTexture() const;
void generateTexture();
/**

View File

@@ -74,7 +74,11 @@ sp<DeferredLayerUpdater> TestUtils::createTextureLayerUpdater(
layerUpdater->setTransform(&transform);
// updateLayer so it's ready to draw
layerUpdater->updateLayer(true, GL_TEXTURE_EXTERNAL_OES, Matrix4::identity().data);
layerUpdater->updateLayer(true, Matrix4::identity().data);
if (layerUpdater->backingLayer()->getApi() == Layer::Api::OpenGL) {
static_cast<GlLayer*>(layerUpdater->backingLayer())->setRenderTarget(
GL_TEXTURE_EXTERNAL_OES);
}
return layerUpdater;
}

View File

@@ -44,7 +44,12 @@ RENDERTHREAD_TEST(DeferredLayerUpdater, updateLayer) {
// push the deferred updates to the layer
Matrix4 scaledMatrix;
scaledMatrix.loadScale(0.5, 0.5, 0.0);
layerUpdater->updateLayer(true, GL_TEXTURE_EXTERNAL_OES, scaledMatrix.data);
layerUpdater->updateLayer(true, scaledMatrix.data);
if (layerUpdater->backingLayer()->getApi() == Layer::Api::OpenGL) {
GlLayer* glLayer = static_cast<GlLayer*>(layerUpdater->backingLayer());
glLayer->setRenderTarget(GL_TEXTURE_EXTERNAL_OES);
}
// the backing layer should now have all the properties applied.
if (layerUpdater->backingLayer()->getApi() == Layer::Api::OpenGL) {