Commit c9bdeff4 by Jamie Madill Committed by Commit Bot

D3D11: Refactor RenderTarget apply into StateManager11.

This is a refactoring patch only, and doesn't change the behaviour. The intent is to make it easy to turn on the Framebuffer dirty bits in a subsequent patch, once we can cleanly handle textures and renderbuffers getting recreated. BUG=angleproject:1260 Change-Id: Iaa5cfe222b020724e088eee5f1ae909b6f981a08 Reviewed-on: https://chromium-review.googlesource.com/325423Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent 570f67d7
...@@ -8,8 +8,15 @@ ...@@ -8,8 +8,15 @@
#include "common/debug.h" #include "common/debug.h"
#include <stdio.h> #include <stdio.h>
#include <limits>
#include <vector> #include <vector>
namespace angle
{
const uintptr_t DirtyPointer = std::numeric_limits<uintptr_t>::max();
}
size_t FormatStringIntoVector(const char *fmt, va_list vararg, std::vector<char>& outBuffer) size_t FormatStringIntoVector(const char *fmt, va_list vararg, std::vector<char>& outBuffer)
{ {
// Attempt to just print to the current buffer // Attempt to just print to the current buffer
......
...@@ -33,6 +33,7 @@ class NonCopyable ...@@ -33,6 +33,7 @@ class NonCopyable
void operator=(const NonCopyable&) = delete; void operator=(const NonCopyable&) = delete;
}; };
extern const uintptr_t DirtyPointer;
} }
template <typename T, size_t N> template <typename T, size_t N>
......
...@@ -37,8 +37,6 @@ const int ScratchMemoryBufferLifetime = 1000; ...@@ -37,8 +37,6 @@ const int ScratchMemoryBufferLifetime = 1000;
} // anonymous namespace } // anonymous namespace
const uintptr_t RendererD3D::DirtyPointer = std::numeric_limits<uintptr_t>::max();
RendererD3D::RendererD3D(egl::Display *display) RendererD3D::RendererD3D(egl::Display *display)
: mDisplay(display), : mDisplay(display),
mDeviceLost(false), mDeviceLost(false),
......
...@@ -172,8 +172,6 @@ class RendererD3D : public Renderer, public BufferFactoryD3D ...@@ -172,8 +172,6 @@ class RendererD3D : public Renderer, public BufferFactoryD3D
SourceIndexData *sourceIndexInfo) = 0; SourceIndexData *sourceIndexInfo) = 0;
virtual void applyTransformFeedbackBuffers(const gl::State& state) = 0; virtual void applyTransformFeedbackBuffers(const gl::State& state) = 0;
virtual void markAllStateDirty() = 0;
virtual unsigned int getReservedVertexUniformVectors() const = 0; virtual unsigned int getReservedVertexUniformVectors() const = 0;
virtual unsigned int getReservedFragmentUniformVectors() const = 0; virtual unsigned int getReservedFragmentUniformVectors() const = 0;
virtual unsigned int getReservedVertexUniformBuffers() const = 0; virtual unsigned int getReservedVertexUniformBuffers() const = 0;
...@@ -263,7 +261,6 @@ class RendererD3D : public Renderer, public BufferFactoryD3D ...@@ -263,7 +261,6 @@ class RendererD3D : public Renderer, public BufferFactoryD3D
static unsigned int GetBlendSampleMask(const gl::Data &data, int samples); static unsigned int GetBlendSampleMask(const gl::Data &data, int samples);
// dirtyPointer is a special value that will make the comparison with any valid pointer fail and force the renderer to re-apply the state. // dirtyPointer is a special value that will make the comparison with any valid pointer fail and force the renderer to re-apply the state.
static const uintptr_t DirtyPointer;
egl::Display *mDisplay; egl::Display *mDisplay;
bool mDeviceLost; bool mDeviceLost;
......
...@@ -709,7 +709,8 @@ gl::Error Blit11::swizzleTexture(ID3D11ShaderResourceView *source, ...@@ -709,7 +709,8 @@ gl::Error Blit11::swizzleTexture(ID3D11ShaderResourceView *source,
deviceContext->GSSetShader(support.geometryShader, nullptr, 0); deviceContext->GSSetShader(support.geometryShader, nullptr, 0);
// Unset the currently bound shader resource to avoid conflicts // Unset the currently bound shader resource to avoid conflicts
mRenderer->setShaderResource(gl::SAMPLER_PIXEL, 0, nullptr); auto stateManager = mRenderer->getStateManager();
stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, nullptr);
// Apply render target // Apply render target
mRenderer->setOneTimeRenderTarget(dest); mRenderer->setOneTimeRenderTarget(dest);
...@@ -725,7 +726,7 @@ gl::Error Blit11::swizzleTexture(ID3D11ShaderResourceView *source, ...@@ -725,7 +726,7 @@ gl::Error Blit11::swizzleTexture(ID3D11ShaderResourceView *source,
deviceContext->RSSetViewports(1, &viewport); deviceContext->RSSetViewports(1, &viewport);
// Apply textures // Apply textures
mRenderer->setShaderResource(gl::SAMPLER_PIXEL, 0, source); stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, source);
// Apply samplers // Apply samplers
deviceContext->PSSetSamplers(0, 1, &mPointSampler); deviceContext->PSSetSamplers(0, 1, &mPointSampler);
...@@ -734,7 +735,7 @@ gl::Error Blit11::swizzleTexture(ID3D11ShaderResourceView *source, ...@@ -734,7 +735,7 @@ gl::Error Blit11::swizzleTexture(ID3D11ShaderResourceView *source,
deviceContext->Draw(drawCount, 0); deviceContext->Draw(drawCount, 0);
// Unbind textures and render targets and vertex buffer // Unbind textures and render targets and vertex buffer
mRenderer->setShaderResource(gl::SAMPLER_PIXEL, 0, nullptr); stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, nullptr);
mRenderer->unapplyRenderTargets(); mRenderer->unapplyRenderTargets();
...@@ -846,7 +847,8 @@ gl::Error Blit11::copyTexture(ID3D11ShaderResourceView *source, ...@@ -846,7 +847,8 @@ gl::Error Blit11::copyTexture(ID3D11ShaderResourceView *source,
deviceContext->GSSetShader(support.geometryShader, nullptr, 0); deviceContext->GSSetShader(support.geometryShader, nullptr, 0);
// Unset the currently bound shader resource to avoid conflicts // Unset the currently bound shader resource to avoid conflicts
mRenderer->setShaderResource(gl::SAMPLER_PIXEL, 0, nullptr); auto stateManager = mRenderer->getStateManager();
stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, nullptr);
// Apply render target // Apply render target
mRenderer->setOneTimeRenderTarget(dest); mRenderer->setOneTimeRenderTarget(dest);
...@@ -862,7 +864,7 @@ gl::Error Blit11::copyTexture(ID3D11ShaderResourceView *source, ...@@ -862,7 +864,7 @@ gl::Error Blit11::copyTexture(ID3D11ShaderResourceView *source,
deviceContext->RSSetViewports(1, &viewport); deviceContext->RSSetViewports(1, &viewport);
// Apply textures // Apply textures
mRenderer->setShaderResource(gl::SAMPLER_PIXEL, 0, source); stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, source);
// Apply samplers // Apply samplers
ID3D11SamplerState *sampler = nullptr; ID3D11SamplerState *sampler = nullptr;
...@@ -881,7 +883,7 @@ gl::Error Blit11::copyTexture(ID3D11ShaderResourceView *source, ...@@ -881,7 +883,7 @@ gl::Error Blit11::copyTexture(ID3D11ShaderResourceView *source,
deviceContext->Draw(drawCount, 0); deviceContext->Draw(drawCount, 0);
// Unbind textures and render targets and vertex buffer // Unbind textures and render targets and vertex buffer
mRenderer->setShaderResource(gl::SAMPLER_PIXEL, 0, nullptr); stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, nullptr);
mRenderer->unapplyRenderTargets(); mRenderer->unapplyRenderTargets();
...@@ -973,7 +975,8 @@ gl::Error Blit11::copyDepth(ID3D11ShaderResourceView *source, const gl::Box &sou ...@@ -973,7 +975,8 @@ gl::Error Blit11::copyDepth(ID3D11ShaderResourceView *source, const gl::Box &sou
deviceContext->GSSetShader(nullptr, nullptr, 0); deviceContext->GSSetShader(nullptr, nullptr, 0);
// Unset the currently bound shader resource to avoid conflicts // Unset the currently bound shader resource to avoid conflicts
mRenderer->setShaderResource(gl::SAMPLER_PIXEL, 0, nullptr); auto stateManager = mRenderer->getStateManager();
stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, nullptr);
// Apply render target // Apply render target
deviceContext->OMSetRenderTargets(0, nullptr, dest); deviceContext->OMSetRenderTargets(0, nullptr, dest);
...@@ -989,7 +992,7 @@ gl::Error Blit11::copyDepth(ID3D11ShaderResourceView *source, const gl::Box &sou ...@@ -989,7 +992,7 @@ gl::Error Blit11::copyDepth(ID3D11ShaderResourceView *source, const gl::Box &sou
deviceContext->RSSetViewports(1, &viewport); deviceContext->RSSetViewports(1, &viewport);
// Apply textures // Apply textures
mRenderer->setShaderResource(gl::SAMPLER_PIXEL, 0, source); stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, source);
// Apply samplers // Apply samplers
deviceContext->PSSetSamplers(0, 1, &mPointSampler); deviceContext->PSSetSamplers(0, 1, &mPointSampler);
...@@ -998,7 +1001,7 @@ gl::Error Blit11::copyDepth(ID3D11ShaderResourceView *source, const gl::Box &sou ...@@ -998,7 +1001,7 @@ gl::Error Blit11::copyDepth(ID3D11ShaderResourceView *source, const gl::Box &sou
deviceContext->Draw(drawCount, 0); deviceContext->Draw(drawCount, 0);
// Unbind textures and render targets and vertex buffer // Unbind textures and render targets and vertex buffer
mRenderer->setShaderResource(gl::SAMPLER_PIXEL, 0, nullptr); stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, nullptr);
mRenderer->unapplyRenderTargets(); mRenderer->unapplyRenderTargets();
......
...@@ -224,11 +224,12 @@ gl::Error PixelTransfer11::copyBufferToTexture(const gl::PixelUnpackState &unpac ...@@ -224,11 +224,12 @@ gl::Error PixelTransfer11::copyBufferToTexture(const gl::PixelUnpackState &unpac
// Are we doing a 2D or 3D copy? // Are we doing a 2D or 3D copy?
ID3D11GeometryShader *geometryShader = ((destSize.depth > 1) ? mBufferToTextureGS : NULL); ID3D11GeometryShader *geometryShader = ((destSize.depth > 1) ? mBufferToTextureGS : NULL);
auto stateManager = mRenderer->getStateManager();
deviceContext->VSSetShader(mBufferToTextureVS, NULL, 0); deviceContext->VSSetShader(mBufferToTextureVS, NULL, 0);
deviceContext->GSSetShader(geometryShader, NULL, 0); deviceContext->GSSetShader(geometryShader, NULL, 0);
deviceContext->PSSetShader(pixelShader, NULL, 0); deviceContext->PSSetShader(pixelShader, NULL, 0);
mRenderer->setShaderResource(gl::SAMPLER_PIXEL, 0, bufferSRV); stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, bufferSRV);
deviceContext->IASetInputLayout(NULL); deviceContext->IASetInputLayout(NULL);
deviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_POINTLIST); deviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_POINTLIST);
...@@ -261,7 +262,7 @@ gl::Error PixelTransfer11::copyBufferToTexture(const gl::PixelUnpackState &unpac ...@@ -261,7 +262,7 @@ gl::Error PixelTransfer11::copyBufferToTexture(const gl::PixelUnpackState &unpac
deviceContext->Draw(numPixels, 0); deviceContext->Draw(numPixels, 0);
// Unbind textures and render targets and vertex buffer // Unbind textures and render targets and vertex buffer
mRenderer->setShaderResource(gl::SAMPLER_PIXEL, 0, NULL); stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, NULL);
deviceContext->VSSetConstantBuffers(0, 1, &nullBuffer); deviceContext->VSSetConstantBuffers(0, 1, &nullBuffer);
mRenderer->markAllStateDirty(); mRenderer->markAllStateDirty();
......
...@@ -145,9 +145,6 @@ class Renderer11 : public RendererD3D ...@@ -145,9 +145,6 @@ class Renderer11 : public RendererD3D
SourceIndexData *sourceIndexInfo) override; SourceIndexData *sourceIndexInfo) override;
void applyTransformFeedbackBuffers(const gl::State &state) override; void applyTransformFeedbackBuffers(const gl::State &state) override;
virtual void markAllStateDirty();
void markRenderTargetStateDirty();
// lost device // lost device
bool testDeviceLost() override; bool testDeviceLost() override;
bool testDeviceResettable() override; bool testDeviceResettable() override;
...@@ -254,6 +251,7 @@ class Renderer11 : public RendererD3D ...@@ -254,6 +251,7 @@ class Renderer11 : public RendererD3D
virtual gl::Error fastCopyBufferToTexture(const gl::PixelUnpackState &unpack, unsigned int offset, RenderTargetD3D *destRenderTarget, virtual gl::Error fastCopyBufferToTexture(const gl::PixelUnpackState &unpack, unsigned int offset, RenderTargetD3D *destRenderTarget,
GLenum destinationFormat, GLenum sourcePixelsType, const gl::Box &destArea); GLenum destinationFormat, GLenum sourcePixelsType, const gl::Box &destArea);
void markAllStateDirty();
void unapplyRenderTargets(); void unapplyRenderTargets();
void setOneTimeRenderTarget(ID3D11RenderTargetView *renderTargetView); void setOneTimeRenderTarget(ID3D11RenderTargetView *renderTargetView);
gl::Error packPixels(const TextureHelper11 &textureHelper, gl::Error packPixels(const TextureHelper11 &textureHelper,
...@@ -272,8 +270,6 @@ class Renderer11 : public RendererD3D ...@@ -272,8 +270,6 @@ class Renderer11 : public RendererD3D
const gl::PixelPackState &pack, const gl::PixelPackState &pack,
uint8_t *pixels); uint8_t *pixels);
void setShaderResource(gl::SamplerType shaderType, UINT resourceSlot, ID3D11ShaderResourceView *srv);
gl::Error blitRenderbufferRect(const gl::Rectangle &readRect, const gl::Rectangle &drawRect, RenderTargetD3D *readRenderTarget, gl::Error blitRenderbufferRect(const gl::Rectangle &readRect, const gl::Rectangle &drawRect, RenderTargetD3D *readRenderTarget,
RenderTargetD3D *drawRenderTarget, GLenum filter, const gl::Rectangle *scissor, RenderTargetD3D *drawRenderTarget, GLenum filter, const gl::Rectangle *scissor,
bool colorBlit, bool depthBlit, bool stencilBlit); bool colorBlit, bool depthBlit, bool stencilBlit);
...@@ -283,6 +279,7 @@ class Renderer11 : public RendererD3D ...@@ -283,6 +279,7 @@ class Renderer11 : public RendererD3D
RendererClass getRendererClass() const override { return RENDERER_D3D11; } RendererClass getRendererClass() const override { return RENDERER_D3D11; }
InputLayoutCache *getInputLayoutCache() { return &mInputLayoutCache; } InputLayoutCache *getInputLayoutCache() { return &mInputLayoutCache; }
StateManager11 *getStateManager() { return &mStateManager; }
void onSwap(); void onSwap();
void onBufferDelete(const Buffer11 *deleted); void onBufferDelete(const Buffer11 *deleted);
...@@ -329,7 +326,6 @@ class Renderer11 : public RendererD3D ...@@ -329,7 +326,6 @@ class Renderer11 : public RendererD3D
int instances); int instances);
ID3D11Texture2D *resolveMultisampledTexture(ID3D11Texture2D *source, unsigned int subresource); ID3D11Texture2D *resolveMultisampledTexture(ID3D11Texture2D *source, unsigned int subresource);
void unsetConflictingSRVs(gl::SamplerType shaderType, uintptr_t resource, const gl::ImageIndex &index);
void populateRenderer11DeviceCaps(); void populateRenderer11DeviceCaps();
...@@ -366,49 +362,6 @@ class Renderer11 : public RendererD3D ...@@ -366,49 +362,6 @@ class Renderer11 : public RendererD3D
std::vector<bool> mForceSetPixelSamplerStates; std::vector<bool> mForceSetPixelSamplerStates;
std::vector<gl::SamplerState> mCurPixelSamplerStates; std::vector<gl::SamplerState> mCurPixelSamplerStates;
// Currently applied textures
struct SRVRecord
{
uintptr_t srv;
uintptr_t resource;
D3D11_SHADER_RESOURCE_VIEW_DESC desc;
};
// A cache of current SRVs that also tracks the highest 'used' (non-NULL) SRV
// We might want to investigate a more robust approach that is also fast when there's
// a large gap between used SRVs (e.g. if SRV 0 and 7 are non-NULL, this approach will
// waste time on SRVs 1-6.)
class SRVCache : angle::NonCopyable
{
public:
SRVCache()
: mHighestUsedSRV(0)
{
}
void initialize(size_t size)
{
mCurrentSRVs.resize(size);
}
size_t size() const { return mCurrentSRVs.size(); }
size_t highestUsed() const { return mHighestUsedSRV; }
const SRVRecord &operator[](size_t index) const { return mCurrentSRVs[index]; }
void clear();
void update(size_t resourceIndex, ID3D11ShaderResourceView *srv);
private:
std::vector<SRVRecord> mCurrentSRVs;
size_t mHighestUsedSRV;
};
SRVCache mCurVertexSRVs;
SRVCache mCurPixelSRVs;
// A block of NULL pointers, cached so we don't re-allocate every draw call
std::vector<ID3D11ShaderResourceView*> mNullSRVs;
StateManager11 mStateManager; StateManager11 mStateManager;
// Currently applied primitive topology // Currently applied primitive topology
......
...@@ -9,10 +9,13 @@ ...@@ -9,10 +9,13 @@
#ifndef LIBANGLE_RENDERER_D3D11_STATEMANAGER11_H_ #ifndef LIBANGLE_RENDERER_D3D11_STATEMANAGER11_H_
#define LIBANGLE_RENDERER_D3D11_STATEMANAGER11_H_ #define LIBANGLE_RENDERER_D3D11_STATEMANAGER11_H_
#include <array>
#include "libANGLE/angletypes.h" #include "libANGLE/angletypes.h"
#include "libANGLE/Data.h" #include "libANGLE/Data.h"
#include "libANGLE/State.h" #include "libANGLE/State.h"
#include "libANGLE/renderer/d3d/d3d11/RenderStateCache.h" #include "libANGLE/renderer/d3d/d3d11/RenderStateCache.h"
#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
#include "libANGLE/renderer/d3d/RendererD3D.h" #include "libANGLE/renderer/d3d/RendererD3D.h"
namespace rx namespace rx
...@@ -24,13 +27,10 @@ struct Renderer11DeviceCaps; ...@@ -24,13 +27,10 @@ struct Renderer11DeviceCaps;
class StateManager11 final : angle::NonCopyable class StateManager11 final : angle::NonCopyable
{ {
public: public:
StateManager11(); StateManager11(Renderer11 *renderer);
~StateManager11(); ~StateManager11();
void initialize(ID3D11DeviceContext *deviceContext, void initialize(const gl::Caps &caps);
RenderStateCache *stateCache,
Renderer11DeviceCaps *renderer11DeviceCaps);
void syncState(const gl::State &state, const gl::State::DirtyBits &dirtyBits); void syncState(const gl::State &state, const gl::State::DirtyBits &dirtyBits);
gl::Error setBlendState(const gl::Framebuffer *framebuffer, gl::Error setBlendState(const gl::Framebuffer *framebuffer,
...@@ -46,19 +46,33 @@ class StateManager11 final : angle::NonCopyable ...@@ -46,19 +46,33 @@ class StateManager11 final : angle::NonCopyable
void setViewport(const gl::Caps *caps, const gl::Rectangle &viewport, float zNear, float zFar); void setViewport(const gl::Caps *caps, const gl::Rectangle &viewport, float zNear, float zFar);
void forceSetBlendState() { mBlendStateIsDirty = true; }
void forceSetDepthStencilState() { mDepthStencilStateIsDirty = true; }
void forceSetRasterState() { mRasterizerStateIsDirty = true; }
void forceSetScissorState() { mScissorStateIsDirty = true; }
void forceSetViewportState() { mViewportStateIsDirty = true; }
void setViewportBounds(const int width, const int height);
const dx_VertexConstants &getVertexConstants() const { return mVertexConstants; } const dx_VertexConstants &getVertexConstants() const { return mVertexConstants; }
const dx_PixelConstants &getPixelConstants() const { return mPixelConstants; } const dx_PixelConstants &getPixelConstants() const { return mPixelConstants; }
void updateStencilSizeIfChanged(bool depthStencilInitialized, unsigned int stencilSize); void updateStencilSizeIfChanged(bool depthStencilInitialized, unsigned int stencilSize);
void setShaderResource(gl::SamplerType shaderType,
UINT resourceSlot,
ID3D11ShaderResourceView *srv);
gl::Error clearTextures(gl::SamplerType samplerType, size_t rangeStart, size_t rangeEnd);
gl::Error syncFramebuffer(const gl::Framebuffer *framebuffer);
void invalidateRenderTarget();
void invalidateEverything();
bool setRenderTargets(const RenderTargetArray &renderTargets,
ID3D11DepthStencilView *depthStencil);
void setRenderTarget(ID3D11RenderTargetView *renderTarget,
ID3D11DepthStencilView *depthStencil);
private: private:
void unsetConflictingSRVs(gl::SamplerType shaderType,
uintptr_t resource,
const gl::ImageIndex &index);
void setViewportBounds(const int width, const int height);
Renderer11 *mRenderer;
// Blend State // Blend State
bool mBlendStateIsDirty; bool mBlendStateIsDirty;
// TODO(dianx) temporary representation of a dirty bit. once we move enough states in, // TODO(dianx) temporary representation of a dirty bit. once we move enough states in,
...@@ -98,9 +112,50 @@ class StateManager11 final : angle::NonCopyable ...@@ -98,9 +112,50 @@ class StateManager11 final : angle::NonCopyable
// Render target variables // Render target variables
gl::Extents mViewportBounds; gl::Extents mViewportBounds;
Renderer11DeviceCaps *mRenderer11DeviceCaps; // EGL_ANGLE_experimental_present_path variables
ID3D11DeviceContext *mDeviceContext; bool mCurPresentPathFastEnabled;
RenderStateCache *mStateCache; int mCurPresentPathFastColorBufferHeight;
// Current RenderTarget state
std::array<uintptr_t, gl::IMPLEMENTATION_MAX_DRAW_BUFFERS> mAppliedRTVs;
uintptr_t mAppliedDSV;
// Currently applied textures
struct SRVRecord
{
uintptr_t srv;
uintptr_t resource;
D3D11_SHADER_RESOURCE_VIEW_DESC desc;
};
// A cache of current SRVs that also tracks the highest 'used' (non-NULL) SRV
// We might want to investigate a more robust approach that is also fast when there's
// a large gap between used SRVs (e.g. if SRV 0 and 7 are non-NULL, this approach will
// waste time on SRVs 1-6.)
class SRVCache : angle::NonCopyable
{
public:
SRVCache() : mHighestUsedSRV(0) {}
void initialize(size_t size) { mCurrentSRVs.resize(size); }
size_t size() const { return mCurrentSRVs.size(); }
size_t highestUsed() const { return mHighestUsedSRV; }
const SRVRecord &operator[](size_t index) const { return mCurrentSRVs[index]; }
void clear();
void update(size_t resourceIndex, ID3D11ShaderResourceView *srv);
private:
std::vector<SRVRecord> mCurrentSRVs;
size_t mHighestUsedSRV;
};
SRVCache mCurVertexSRVs;
SRVCache mCurPixelSRVs;
// A block of NULL pointers, cached so we don't re-allocate every draw call
std::vector<ID3D11ShaderResourceView *> mNullSRVs;
}; };
} // namespace rx } // namespace rx
......
...@@ -746,7 +746,8 @@ EGLint SwapChain11::copyOffscreenToBackbuffer(EGLint x, EGLint y, EGLint width, ...@@ -746,7 +746,8 @@ EGLint SwapChain11::copyOffscreenToBackbuffer(EGLint x, EGLint y, EGLint width,
deviceContext->RSSetViewports(1, &viewport); deviceContext->RSSetViewports(1, &viewport);
// Apply textures // Apply textures
mRenderer->setShaderResource(gl::SAMPLER_PIXEL, 0, mOffscreenSRView); auto stateManager = mRenderer->getStateManager();
stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, mOffscreenSRView);
deviceContext->PSSetSamplers(0, 1, &mPassThroughSampler); deviceContext->PSSetSamplers(0, 1, &mPassThroughSampler);
// Draw // Draw
...@@ -755,7 +756,7 @@ EGLint SwapChain11::copyOffscreenToBackbuffer(EGLint x, EGLint y, EGLint width, ...@@ -755,7 +756,7 @@ EGLint SwapChain11::copyOffscreenToBackbuffer(EGLint x, EGLint y, EGLint width,
// Rendering to the swapchain is now complete. Now we can call Present(). // Rendering to the swapchain is now complete. Now we can call Present().
// Before that, we perform any cleanup on the D3D device. We do this before Present() to make sure the // Before that, we perform any cleanup on the D3D device. We do this before Present() to make sure the
// cleanup is caught under the current eglSwapBuffers() PIX/Graphics Diagnostics call rather than the next one. // cleanup is caught under the current eglSwapBuffers() PIX/Graphics Diagnostics call rather than the next one.
mRenderer->setShaderResource(gl::SAMPLER_PIXEL, 0, NULL); stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, NULL);
mRenderer->unapplyRenderTargets(); mRenderer->unapplyRenderTargets();
mRenderer->markAllStateDirty(); mRenderer->markAllStateDirty();
...@@ -803,7 +804,7 @@ EGLint SwapChain11::present(EGLint x, EGLint y, EGLint width, EGLint height) ...@@ -803,7 +804,7 @@ EGLint SwapChain11::present(EGLint x, EGLint y, EGLint width, EGLint height)
// Some swapping mechanisms such as DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL unbind the current render // Some swapping mechanisms such as DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL unbind the current render
// target. Mark it dirty. // target. Mark it dirty.
mRenderer->markRenderTargetStateDirty(); mRenderer->getStateManager()->invalidateRenderTarget();
if (result == DXGI_ERROR_DEVICE_REMOVED) if (result == DXGI_ERROR_DEVICE_REMOVED)
{ {
......
...@@ -10,13 +10,14 @@ ...@@ -10,13 +10,14 @@
#ifndef LIBANGLE_RENDERER_D3D_D3D11_RENDERER11_UTILS_H_ #ifndef LIBANGLE_RENDERER_D3D_D3D11_RENDERER11_UTILS_H_
#define LIBANGLE_RENDERER_D3D_D3D11_RENDERER11_UTILS_H_ #define LIBANGLE_RENDERER_D3D_D3D11_RENDERER11_UTILS_H_
#include <array>
#include <vector>
#include "libANGLE/angletypes.h" #include "libANGLE/angletypes.h"
#include "libANGLE/Caps.h" #include "libANGLE/Caps.h"
#include "libANGLE/Error.h" #include "libANGLE/Error.h"
#include "libANGLE/renderer/d3d/RendererD3D.h" #include "libANGLE/renderer/d3d/RendererD3D.h"
#include <vector>
namespace gl namespace gl
{ {
class FramebufferAttachment; class FramebufferAttachment;
...@@ -28,6 +29,8 @@ class RenderTarget11; ...@@ -28,6 +29,8 @@ class RenderTarget11;
struct WorkaroundsD3D; struct WorkaroundsD3D;
struct Renderer11DeviceCaps; struct Renderer11DeviceCaps;
using RenderTargetArray = std::array<ID3D11RenderTargetView *, gl::IMPLEMENTATION_MAX_DRAW_BUFFERS>;
namespace gl_d3d11 namespace gl_d3d11
{ {
......
...@@ -2007,14 +2007,14 @@ void Renderer9::markAllStateDirty() ...@@ -2007,14 +2007,14 @@ void Renderer9::markAllStateDirty()
for (unsigned int i = 0; i < mCurVertexTextures.size(); i++) for (unsigned int i = 0; i < mCurVertexTextures.size(); i++)
{ {
mCurVertexSamplerStates[i].forceSet = true; mCurVertexSamplerStates[i].forceSet = true;
mCurVertexTextures[i] = DirtyPointer; mCurVertexTextures[i] = angle::DirtyPointer;
} }
ASSERT(mCurPixelSamplerStates.size() == mCurPixelTextures.size()); ASSERT(mCurPixelSamplerStates.size() == mCurPixelTextures.size());
for (unsigned int i = 0; i < mCurPixelSamplerStates.size(); i++) for (unsigned int i = 0; i < mCurPixelSamplerStates.size(); i++)
{ {
mCurPixelSamplerStates[i].forceSet = true; mCurPixelSamplerStates[i].forceSet = true;
mCurPixelTextures[i] = DirtyPointer; mCurPixelTextures[i] = angle::DirtyPointer;
} }
mAppliedIBSerial = 0; mAppliedIBSerial = 0;
......
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