Merge "Always flush renderstate in DeferredLayerUpdater::apply"
This commit is contained in:
@@ -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() {
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user