Implemented Renderer11::setRasterizerState and Renderer11::setScissorRectangle.

TRAC #22043 Signed-off-by: Shannon Woods Signed-off-by: Daniel Koch Author: Geoff Lang git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1436 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent ed453e07
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "common/debug.h" #include "common/debug.h"
#include "libGLESv2/utilities.h" #include "libGLESv2/utilities.h"
#include "libGLESv2/mathutil.h"
#include "libGLESv2/renderer/Renderer11.h" #include "libGLESv2/renderer/Renderer11.h"
#include "libGLESv2/renderer/renderer11_utils.h" #include "libGLESv2/renderer/renderer11_utils.h"
...@@ -39,6 +40,8 @@ Renderer11::Renderer11(egl::Display *display, HDC hDc) : Renderer(display), mDc( ...@@ -39,6 +40,8 @@ Renderer11::Renderer11(egl::Display *display, HDC hDc) : Renderer(display), mDc(
mDxgiFactory = NULL; mDxgiFactory = NULL;
mForceSetBlendState = true; mForceSetBlendState = true;
mForceSetRasterState = true;
mForceSetScissor = true;
} }
Renderer11::~Renderer11() Renderer11::~Renderer11()
...@@ -254,8 +257,28 @@ void Renderer11::setTexture(gl::SamplerType type, int index, gl::Texture *textur ...@@ -254,8 +257,28 @@ void Renderer11::setTexture(gl::SamplerType type, int index, gl::Texture *textur
void Renderer11::setRasterizerState(const gl::RasterizerState &rasterState, unsigned int depthSize) void Renderer11::setRasterizerState(const gl::RasterizerState &rasterState, unsigned int depthSize)
{ {
// TODO if (mForceSetRasterState ||
UNIMPLEMENTED(); memcmp(&rasterState, &mCurRasterState, sizeof(gl::RasterizerState)) != 0 ||
depthSize != mCurDepthSize)
{
ID3D11RasterizerState *dxRasterState = mStateCache.getRasterizerState(rasterState, depthSize);
if (!dxRasterState)
{
ERR("NULL blend state returned by RenderStateCache::getRasterizerState, setting the "
"rasterizer state.");
}
mDeviceContext->RSSetState(dxRasterState);
if (dxRasterState)
{
dxRasterState->Release();
}
mCurRasterState = rasterState;
mCurDepthSize = depthSize;
}
mForceSetRasterState = false;
} }
void Renderer11::setBlendState(const gl::BlendState &blendState, const gl::Color &blendColor, void Renderer11::setBlendState(const gl::BlendState &blendState, const gl::Color &blendColor,
...@@ -298,14 +321,33 @@ void Renderer11::setDepthStencilState(const gl::DepthStencilState &depthStencilS ...@@ -298,14 +321,33 @@ void Renderer11::setDepthStencilState(const gl::DepthStencilState &depthStencilS
void Renderer11::setScissorRectangle(const gl::Rectangle& scissor, unsigned int renderTargetWidth, void Renderer11::setScissorRectangle(const gl::Rectangle& scissor, unsigned int renderTargetWidth,
unsigned int renderTargetHeight) unsigned int renderTargetHeight)
{ {
// TODO if (mForceSetScissor ||
UNIMPLEMENTED(); renderTargetWidth != mCurRenderTargetWidth ||
renderTargetHeight != mCurRenderTargetHeight ||
memcmp(&scissor, &mCurScissor, sizeof(gl::Rectangle)) != 0)
{
D3D11_RECT rect;
rect.left = gl::clamp(scissor.x, 0, static_cast<int>(renderTargetWidth));
rect.top = gl::clamp(scissor.y, 0, static_cast<int>(renderTargetWidth));
rect.right = gl::clamp(scissor.x + scissor.width, 0, static_cast<int>(renderTargetWidth));
rect.bottom = gl::clamp(scissor.y + scissor.height, 0, static_cast<int>(renderTargetWidth));
mDeviceContext->RSSetScissorRects(1, &rect);
mCurScissor = scissor;
mCurRenderTargetWidth = renderTargetWidth;
mCurRenderTargetHeight = renderTargetHeight;
}
mForceSetScissor = false;
} }
void Renderer11::applyRenderTarget(gl::Framebuffer *frameBuffer) void Renderer11::applyRenderTarget(gl::Framebuffer *frameBuffer)
{ {
// TODO // TODO
UNIMPLEMENTED(); UNIMPLEMENTED();
mForceSetScissor = true;
} }
void Renderer11::clear(GLbitfield mask, const gl::Color &colorClear, float depthClear, int stencilClear, void Renderer11::clear(GLbitfield mask, const gl::Color &colorClear, float depthClear, int stencilClear,
...@@ -386,6 +428,8 @@ bool Renderer11::resetDevice() ...@@ -386,6 +428,8 @@ bool Renderer11::resetDevice()
mDeviceLost = false; mDeviceLost = false;
mForceSetBlendState = true; mForceSetBlendState = true;
mForceSetRasterState = true;
mForceSetScissor = true;
return true; return true;
} }
......
...@@ -132,6 +132,17 @@ class Renderer11 : public Renderer ...@@ -132,6 +132,17 @@ class Renderer11 : public Renderer
gl::Color mCurBlendColor; gl::Color mCurBlendColor;
unsigned int mCurSampleMask; unsigned int mCurSampleMask;
// Currently applied rasterizer state
bool mForceSetRasterState;
gl::RasterizerState mCurRasterState;
unsigned int mCurDepthSize;
// Currently applied scissor rectangle
bool mForceSetScissor;
gl::Rectangle mCurScissor;
unsigned int mCurRenderTargetWidth;
unsigned int mCurRenderTargetHeight;
ID3D11Device *mDevice; ID3D11Device *mDevice;
D3D_FEATURE_LEVEL mFeatureLevel; D3D_FEATURE_LEVEL mFeatureLevel;
ID3D11DeviceContext *mDeviceContext; ID3D11DeviceContext *mDeviceContext;
......
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