Commit 92515f44 by Jamie Madill Committed by Commit Bot

Move swizzling and program update to StateManager11.

This makes it in a centralized location where it can work with dirty bits. BUG=angleproject:1387 Change-Id: I3bfeb53c265d1679f6b8556941c1d9d77747aa24 Reviewed-on: https://chromium-review.googlesource.com/648486 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 39967e4e
......@@ -1399,59 +1399,6 @@ void *Renderer11::getD3DDevice()
return reinterpret_cast<void *>(mDevice);
}
gl::Error Renderer11::generateSwizzle(const gl::Context *context, gl::Texture *texture)
{
if (texture)
{
TextureD3D *textureD3D = GetImplAs<TextureD3D>(texture);
ASSERT(textureD3D);
TextureStorage *texStorage = nullptr;
ANGLE_TRY(textureD3D->getNativeTexture(context, &texStorage));
if (texStorage)
{
TextureStorage11 *storage11 = GetAs<TextureStorage11>(texStorage);
const gl::TextureState &textureState = texture->getTextureState();
ANGLE_TRY(storage11->generateSwizzles(context, textureState.getSwizzleState()));
}
}
return gl::NoError();
}
gl::Error Renderer11::generateSwizzles(const gl::Context *context, gl::SamplerType type)
{
const auto &glState = context->getGLState();
ProgramD3D *programD3D = GetImplAs<ProgramD3D>(glState.getProgram());
unsigned int samplerRange = programD3D->getUsedSamplerRange(type);
for (unsigned int i = 0; i < samplerRange; i++)
{
GLenum textureType = programD3D->getSamplerTextureType(type, i);
GLint textureUnit = programD3D->getSamplerMapping(type, i, context->getCaps());
if (textureUnit != -1)
{
gl::Texture *texture = glState.getSamplerTexture(textureUnit, textureType);
ASSERT(texture);
if (texture->getTextureState().swizzleRequired())
{
ANGLE_TRY(generateSwizzle(context, texture));
}
}
}
return gl::NoError();
}
gl::Error Renderer11::generateSwizzles(const gl::Context *context)
{
ANGLE_TRY(generateSwizzles(context, gl::SAMPLER_VERTEX));
ANGLE_TRY(generateSwizzles(context, gl::SAMPLER_PIXEL));
return gl::NoError();
}
gl::Error Renderer11::setUniformBuffers(const gl::ContextState &data,
const std::vector<GLint> &vertexUniformBuffers,
const std::vector<GLint> &fragmentUniformBuffers)
......@@ -4178,10 +4125,6 @@ gl::Error Renderer11::genericDrawElements(const gl::Context *context,
ProgramD3D *programD3D = GetImplAs<ProgramD3D>(program);
bool usesPointSize = programD3D->usesPointSize();
programD3D->updateSamplerMapping();
ANGLE_TRY(generateSwizzles(context));
if (!applyPrimitiveType(mode, count, usesPointSize))
{
return gl::NoError();
......@@ -4217,9 +4160,6 @@ gl::Error Renderer11::genericDrawArrays(const gl::Context *context,
ProgramD3D *programD3D = GetImplAs<ProgramD3D>(program);
bool usesPointSize = programD3D->usesPointSize();
programD3D->updateSamplerMapping();
ANGLE_TRY(generateSwizzles(context));
if (!applyPrimitiveType(mode, count, usesPointSize))
{
return gl::NoError();
......@@ -4254,9 +4194,7 @@ gl::Error Renderer11::genericDrawIndirect(const gl::Context *context,
ASSERT(program != nullptr);
ProgramD3D *programD3D = GetImplAs<ProgramD3D>(program);
bool usesPointSize = programD3D->usesPointSize();
programD3D->updateSamplerMapping();
ANGLE_TRY(generateSwizzles(context));
applyPrimitiveType(mode, 0, usesPointSize);
ANGLE_TRY(mStateManager.updateState(context, mode));
ANGLE_TRY(applyTransformFeedbackBuffers(contextState));
......@@ -4320,16 +4258,9 @@ gl::Error Renderer11::dispatchCompute(const gl::Context *context,
GLuint numGroupsY,
GLuint numGroupsZ)
{
gl::Program *program = context->getGLState().getProgram();
ASSERT(program != nullptr);
ProgramD3D *programD3D = GetImplAs<ProgramD3D>(program);
programD3D->updateSamplerMapping();
ANGLE_TRY(generateSwizzles(context, gl::SAMPLER_COMPUTE));
ANGLE_TRY(mStateManager.updateStateForCompute(context, numGroupsX, numGroupsY, numGroupsZ));
ANGLE_TRY(applyComputeShader(context));
// TODO(Xinghua): applyUniformBuffers for compute shader.
mDeviceContext->Dispatch(numGroupsX, numGroupsY, numGroupsZ);
......
......@@ -509,10 +509,6 @@ class Renderer11 : public RendererD3D
int baseVertex,
int instances);
gl::Error generateSwizzle(const gl::Context *context, gl::Texture *texture);
gl::Error generateSwizzles(const gl::Context *context, gl::SamplerType type);
gl::Error generateSwizzles(const gl::Context *context);
gl::ErrorOrResult<TextureHelper11> resolveMultisampledTexture(const gl::Context *context,
RenderTarget11 *renderTarget,
bool depth,
......
......@@ -445,6 +445,14 @@ gl::Error StateManager11::updateStateForCompute(const gl::Context *context,
mComputeConstants.numWorkGroups[1] = numGroupsY;
mComputeConstants.numWorkGroups[2] = numGroupsZ;
// TODO(jmadill): Use dirty bits.
const auto &glState = context->getGLState();
auto *programD3D = GetImplAs<ProgramD3D>(glState.getProgram());
programD3D->updateSamplerMapping();
// TODO(jmadill): Use dirty bits.
ANGLE_TRY(generateSwizzlesForShader(context, gl::SAMPLER_COMPUTE));
// TODO(jmadill): More complete implementation.
ANGLE_TRY(syncTextures(context));
......@@ -1570,6 +1578,13 @@ void StateManager11::setSingleVertexBuffer(const d3d11::Buffer *buffer, UINT str
gl::Error StateManager11::updateState(const gl::Context *context, GLenum drawMode)
{
const auto &glState = context->getGLState();
auto *programD3D = GetImplAs<ProgramD3D>(glState.getProgram());
// TODO(jmadill): Use dirty bits.
programD3D->updateSamplerMapping();
// TODO(jmadill): Use dirty bits.
ANGLE_TRY(generateSwizzles(context));
// TODO(jmadill): Use dirty bits.
ANGLE_TRY(syncProgram(context, drawMode));
......@@ -1636,7 +1651,6 @@ gl::Error StateManager11::updateState(const gl::Context *context, GLenum drawMod
// This must happen after viewport sync, because the viewport affects builtin uniforms.
// TODO(jmadill): Use dirty bits.
auto *programD3D = GetImplAs<ProgramD3D>(glState.getProgram());
ANGLE_TRY(programD3D->applyUniforms());
ANGLE_TRY(mRenderer->applyDriverUniforms(*programD3D, drawMode));
......@@ -2124,4 +2138,60 @@ gl::Error StateManager11::updateVertexOffsetsForPointSpritesEmulation(GLint star
mRenderer, mCurrentAttributes, startVertex, emulatedInstanceId);
}
gl::Error StateManager11::generateSwizzle(const gl::Context *context, gl::Texture *texture)
{
if (!texture)
{
return gl::NoError();
}
TextureD3D *textureD3D = GetImplAs<TextureD3D>(texture);
ASSERT(textureD3D);
TextureStorage *texStorage = nullptr;
ANGLE_TRY(textureD3D->getNativeTexture(context, &texStorage));
if (texStorage)
{
TextureStorage11 *storage11 = GetAs<TextureStorage11>(texStorage);
const gl::TextureState &textureState = texture->getTextureState();
ANGLE_TRY(storage11->generateSwizzles(context, textureState.getSwizzleState()));
}
return gl::NoError();
}
gl::Error StateManager11::generateSwizzlesForShader(const gl::Context *context,
gl::SamplerType type)
{
const auto &glState = context->getGLState();
ProgramD3D *programD3D = GetImplAs<ProgramD3D>(glState.getProgram());
unsigned int samplerRange = programD3D->getUsedSamplerRange(type);
for (unsigned int i = 0; i < samplerRange; i++)
{
GLenum textureType = programD3D->getSamplerTextureType(type, i);
GLint textureUnit = programD3D->getSamplerMapping(type, i, context->getCaps());
if (textureUnit != -1)
{
gl::Texture *texture = glState.getSamplerTexture(textureUnit, textureType);
ASSERT(texture);
if (texture->getTextureState().swizzleRequired())
{
ANGLE_TRY(generateSwizzle(context, texture));
}
}
}
return gl::NoError();
}
gl::Error StateManager11::generateSwizzles(const gl::Context *context)
{
ANGLE_TRY(generateSwizzlesForShader(context, gl::SAMPLER_VERTEX));
ANGLE_TRY(generateSwizzlesForShader(context, gl::SAMPLER_PIXEL));
return gl::NoError();
}
} // namespace rx
......@@ -263,6 +263,10 @@ class StateManager11 final : angle::NonCopyable
gl::Error syncCurrentValueAttribs(const gl::State &state);
gl::Error generateSwizzle(const gl::Context *context, gl::Texture *texture);
gl::Error generateSwizzlesForShader(const gl::Context *context, gl::SamplerType type);
gl::Error generateSwizzles(const gl::Context *context);
enum DirtyBitType
{
DIRTY_BIT_RENDER_TARGET,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment