Renderer11 now generates swizzles and invalidates the cached swizzles.
Change-Id: If5c998a91195942297beeb26a0ec635ff6a466ea
Reviewed-on: https://chromium-review.googlesource.com/177035
Reviewed-by: Shannon Woods <shannonwoods@chromium.org>
Commit-Queue: Shannon Woods <shannonwoods@chromium.org>
Tested-by: Shannon Woods <shannonwoods@chromium.org>
diff --git a/src/libGLESv2/renderer/d3d11/Renderer11.cpp b/src/libGLESv2/renderer/d3d11/Renderer11.cpp
index 0a8849c..40b6ee7 100644
--- a/src/libGLESv2/renderer/d3d11/Renderer11.cpp
+++ b/src/libGLESv2/renderer/d3d11/Renderer11.cpp
@@ -523,7 +523,17 @@
void Renderer11::generateSwizzle(gl::Texture *texture)
{
- UNIMPLEMENTED();
+ if (texture)
+ {
+ TextureStorageInterface *texStorage = texture->getNativeTexture();
+ if (texStorage)
+ {
+ TextureStorage11 *storage11 = TextureStorage11::makeTextureStorage11(texStorage->getStorageInstance());
+
+ storage11->generateSwizzles(texture->getSwizzleRed(), texture->getSwizzleGreen(), texture->getSwizzleBlue(),
+ texture->getSwizzleAlpha());
+ }
+ }
}
void Renderer11::setSamplerState(gl::SamplerType type, int index, const gl::SamplerState &samplerState)
@@ -1090,6 +1100,8 @@
mDepthStencilInitialized = true;
}
+ invalidateFramebufferSwizzles(framebuffer);
+
return true;
}
@@ -1597,6 +1609,7 @@
void Renderer11::clear(const gl::ClearParameters &clearParams, gl::Framebuffer *frameBuffer)
{
mClear->clearFramebuffer(clearParams, frameBuffer);
+ invalidateFramebufferSwizzles(frameBuffer);
}
void Renderer11::markAllStateDirty()
@@ -2378,6 +2391,9 @@
TextureStorage11_2D *dest11 = TextureStorage11_2D::makeTextureStorage11_2D(dest->getStorageInstance());
mDeviceContext->CopyResource(dest11->getBaseTexture(), source11->getBaseTexture());
+
+ dest11->invalidateSwizzleCache();
+
return true;
}
@@ -2392,6 +2408,9 @@
TextureStorage11_Cube *dest11 = TextureStorage11_Cube::makeTextureStorage11_Cube(dest->getStorageInstance());
mDeviceContext->CopyResource(dest11->getBaseTexture(), source11->getBaseTexture());
+
+ dest11->invalidateSwizzleCache();
+
return true;
}
@@ -2406,6 +2425,9 @@
TextureStorage11_3D *dest11 = TextureStorage11_3D::makeTextureStorage11_3D(dest->getStorageInstance());
mDeviceContext->CopyResource(dest11->getBaseTexture(), source11->getBaseTexture());
+
+ dest11->invalidateSwizzleCache();
+
return true;
}
@@ -2420,6 +2442,9 @@
TextureStorage11_2DArray *dest11 = TextureStorage11_2DArray::makeTextureStorage11_2DArray(dest->getStorageInstance());
mDeviceContext->CopyResource(dest11->getBaseTexture(), source11->getBaseTexture());
+
+ dest11->invalidateSwizzleCache();
+
return true;
}
@@ -2482,6 +2507,8 @@
bool ret = mBlit->copyTexture(source, sourceArea, sourceSize, dest, destArea, destSize, NULL,
destFormat, GL_NEAREST);
+ storage11->invalidateSwizzleCacheLevel(level);
+
return ret;
}
@@ -2541,6 +2568,8 @@
bool ret = mBlit->copyTexture(source, sourceArea, sourceSize, dest, destArea, destSize, NULL,
destFormat, GL_NEAREST);
+ storage11->invalidateSwizzleCacheLevel(level);
+
return ret;
}
@@ -2600,6 +2629,8 @@
bool ret = mBlit->copyTexture(source, sourceArea, sourceSize, dest, destArea, destSize, NULL,
destFormat, GL_NEAREST);
+ storage11->invalidateSwizzleCacheLevel(level);
+
return ret;
}
@@ -2661,6 +2692,8 @@
bool ret = mBlit->copyTexture(source, sourceArea, sourceSize, dest, destArea, destSize, NULL,
destFormat, GL_NEAREST);
+ storage11->invalidateSwizzleCacheLevel(level);
+
return ret;
}
@@ -2966,6 +2999,8 @@
}
}
+ invalidateFramebufferSwizzles(drawTarget);
+
return true;
}
@@ -3403,6 +3438,46 @@
}
}
+void Renderer11::invalidateRenderbufferSwizzles(gl::Renderbuffer *renderBuffer, int mipLevel)
+{
+ TextureStorage *texStorage = renderBuffer->getTextureStorage();
+ if (texStorage)
+ {
+ TextureStorage11 *texStorage11 = TextureStorage11::makeTextureStorage11(texStorage);
+ if (!texStorage11)
+ {
+ ERR("texture storage pointer unexpectedly null.");
+ return;
+ }
+
+ texStorage11->invalidateSwizzleCacheLevel(mipLevel);
+ }
+}
+
+void Renderer11::invalidateFramebufferSwizzles(gl::Framebuffer *framebuffer)
+{
+ for (unsigned int colorAttachment = 0; colorAttachment < gl::IMPLEMENTATION_MAX_DRAW_BUFFERS; colorAttachment++)
+ {
+ gl::Renderbuffer *colorbuffer = framebuffer->getColorbuffer(colorAttachment);
+ if (colorbuffer)
+ {
+ invalidateRenderbufferSwizzles(colorbuffer, framebuffer->getColorbufferMipLevel(colorAttachment));
+ }
+ }
+
+ gl::Renderbuffer *depthBuffer = framebuffer->getDepthbuffer();
+ if (depthBuffer)
+ {
+ invalidateRenderbufferSwizzles(depthBuffer, framebuffer->getDepthbufferMipLevel());
+ }
+
+ gl::Renderbuffer *stencilBuffer = framebuffer->getStencilbuffer();
+ if (stencilBuffer)
+ {
+ invalidateRenderbufferSwizzles(stencilBuffer, framebuffer->getStencilbufferMipLevel());
+ }
+}
+
bool Renderer11::getLUID(LUID *adapterLuid) const
{
adapterLuid->HighPart = 0;