Skip to content

Commit 0560464

Browse files
committed
[Toolkit.Graphics] Fix issue with BasicEffect used with an effect that is using Geometry
Shader. Make sure to reset Domain, Hull and Geometry shaders before applying a BasicEffect or PrimitiveQuad.
1 parent 28ebc6b commit 0560464

File tree

3 files changed

+61
-30
lines changed

3 files changed

+61
-30
lines changed

Source/Toolkit/SharpDX.Toolkit.Graphics/GraphicsDevice.cs

+40-30
Original file line numberDiff line numberDiff line change
@@ -95,10 +95,15 @@ public class GraphicsDevice : Component
9595
/// </summary>
9696
public readonly RasterizerStateCollection RasterizerStates;
9797

98-
private InputAssemblerStage inputAssemblerStage;
99-
private RasterizerStage rasterizerStage;
98+
internal InputAssemblerStage InputAssemblerStage;
99+
internal VertexShaderStage VertexShaderStage;
100+
internal DomainShaderStage DomainShaderStage;
101+
internal HullShaderStage HullShaderStage;
102+
internal GeometryShaderStage GeometryShaderStage;
103+
internal RasterizerStage RasterizerStage;
100104
internal PixelShaderStage PixelShaderStage;
101-
private OutputMergerStage outputMergerStage;
105+
internal OutputMergerStage OutputMergerStage;
106+
internal ComputeShaderStage ComputeShaderStage;
102107

103108
internal readonly bool needWorkAroundForUpdateSubResource;
104109

@@ -215,10 +220,15 @@ private void Initialize()
215220
resetVertexBuffersPointer = ToDispose(Utilities.AllocateClearedMemory(Utilities.SizeOf<IntPtr>() * InputAssemblerStage.VertexInputResourceSlotCount));
216221
}
217222

218-
inputAssemblerStage = Context.InputAssembler;
219-
outputMergerStage = Context.OutputMerger;
220-
rasterizerStage = Context.Rasterizer;
223+
InputAssemblerStage = Context.InputAssembler;
224+
VertexShaderStage = Context.VertexShader;
225+
DomainShaderStage = Context.DomainShader;
226+
HullShaderStage = Context.HullShader;
227+
GeometryShaderStage = Context.GeometryShader;
228+
RasterizerStage = Context.Rasterizer;
221229
PixelShaderStage = Context.PixelShader;
230+
OutputMergerStage = Context.OutputMerger;
231+
ComputeShaderStage = Context.ComputeShader;
222232

223233
// Precompute shader stages
224234
ShaderStages = new CommonShaderStage[]
@@ -588,7 +598,7 @@ private PrimitiveTopology PrimitiveType
588598
{
589599
set
590600
{
591-
inputAssemblerStage.PrimitiveTopology = value;
601+
InputAssemblerStage.PrimitiveTopology = value;
592602
}
593603
}
594604

@@ -960,11 +970,11 @@ public void SetBlendState(BlendState blendState)
960970
{
961971
if (blendState == null)
962972
{
963-
outputMergerStage.SetBlendState(null, Color.White, -1);
973+
OutputMergerStage.SetBlendState(null, Color.White, -1);
964974
}
965975
else
966976
{
967-
outputMergerStage.SetBlendState(blendState, blendState.BlendFactor, blendState.MultiSampleMask);
977+
OutputMergerStage.SetBlendState(blendState, blendState.BlendFactor, blendState.MultiSampleMask);
968978
}
969979
}
970980

@@ -984,11 +994,11 @@ public void SetBlendState(BlendState blendState, Color4 blendFactor, int multiSa
984994
{
985995
if (blendState == null)
986996
{
987-
outputMergerStage.SetBlendState(null, blendFactor, multiSampleMask);
997+
OutputMergerStage.SetBlendState(null, blendFactor, multiSampleMask);
988998
}
989999
else
9901000
{
991-
outputMergerStage.SetBlendState(blendState, blendFactor, multiSampleMask);
1001+
OutputMergerStage.SetBlendState(blendState, blendFactor, multiSampleMask);
9921002
}
9931003
}
9941004

@@ -1022,7 +1032,7 @@ public void SetBlendState(BlendState blendState, Color4 blendFactor, uint multiS
10221032
/// <unmanaged-short>ID3D11DeviceContext::OMSetDepthStencilState</unmanaged-short>
10231033
public void SetDepthStencilState(DepthStencilState depthStencilState, int stencilReference = 0)
10241034
{
1025-
outputMergerStage.SetDepthStencilState(depthStencilState, stencilReference);
1035+
OutputMergerStage.SetDepthStencilState(depthStencilState, stencilReference);
10261036
}
10271037

10281038
/// <summary>
@@ -1034,7 +1044,7 @@ public void SetDepthStencilState(DepthStencilState depthStencilState, int stenci
10341044
/// <unmanaged-short>ID3D11DeviceContext::RSSetState</unmanaged-short>
10351045
public void SetRasterizerState(RasterizerState rasterizerState)
10361046
{
1037-
rasterizerStage.State = rasterizerState;
1047+
RasterizerStage.State = rasterizerState;
10381048
}
10391049

10401050
/// <summary>
@@ -1052,7 +1062,7 @@ public void SetRasterizerState(RasterizerState rasterizerState)
10521062
/// <unmanaged-short>ID3D11DeviceContext::RSSetScissorRects</unmanaged-short>
10531063
public void SetScissorRectangles(int left, int top, int right, int bottom)
10541064
{
1055-
rasterizerStage.SetScissorRectangle(left, top, right, bottom);
1065+
RasterizerStage.SetScissorRectangle(left, top, right, bottom);
10561066
}
10571067

10581068
/// <summary>
@@ -1067,7 +1077,7 @@ public void SetScissorRectangles(int left, int top, int right, int bottom)
10671077
/// <unmanaged-short>ID3D11DeviceContext::RSSetScissorRects</unmanaged-short>
10681078
public void SetScissorRectangles(params Rectangle[] scissorRectangles)
10691079
{
1070-
rasterizerStage.SetScissorRectangles(scissorRectangles);
1080+
RasterizerStage.SetScissorRectangles(scissorRectangles);
10711081
}
10721082

10731083
/// <summary>
@@ -1078,7 +1088,7 @@ public ViewportF Viewport
10781088
{
10791089
get
10801090
{
1081-
rasterizerStage.GetViewports(viewports);
1091+
RasterizerStage.GetViewports(viewports);
10821092
return viewports[0];
10831093
}
10841094

@@ -1095,7 +1105,7 @@ public ViewportF Viewport
10951105
/// <returns>Returns a viewport bind on a specified mulrendertarget</returns>
10961106
public ViewportF GetViewport(int index)
10971107
{
1098-
rasterizerStage.GetViewports(viewports);
1108+
RasterizerStage.GetViewports(viewports);
10991109
return viewports[index];
11001110
}
11011111

@@ -1117,7 +1127,7 @@ public ViewportF GetViewport(int index)
11171127
public void SetViewport(float x, float y, float width, float height, float minZ = 0.0f, float maxZ = 1.0f)
11181128
{
11191129
viewports[0] = new ViewportF(x, y, width, height, minZ, maxZ);
1120-
rasterizerStage.SetViewport(x, y, width, height, minZ, maxZ);
1130+
RasterizerStage.SetViewport(x, y, width, height, minZ, maxZ);
11211131
}
11221132

11231133
/// <summary>
@@ -1133,7 +1143,7 @@ public void SetViewport(float x, float y, float width, float height, float minZ
11331143
public void SetViewport(ViewportF viewport)
11341144
{
11351145
viewports[0] = viewport;
1136-
rasterizerStage.SetViewport(viewport);
1146+
RasterizerStage.SetViewport(viewport);
11371147
}
11381148

11391149
/// <summary>
@@ -1151,7 +1161,7 @@ public void SetViewports(params ViewportF[] viewports)
11511161
for (int i = 0; i < viewports.Length; i++)
11521162
this.viewports[i] = viewports[i];
11531163

1154-
rasterizerStage.SetViewports(this.viewports, viewports.Length);
1164+
RasterizerStage.SetViewports(this.viewports, viewports.Length);
11551165
}
11561166

11571167
/// <summary>
@@ -1164,7 +1174,7 @@ public void ResetTargets()
11641174
{
11651175
currentRenderTargetView = null;
11661176
currentDepthStencilView = null;
1167-
outputMergerStage.ResetTargets();
1177+
OutputMergerStage.ResetTargets();
11681178
}
11691179

11701180
/// <summary>
@@ -1186,7 +1196,7 @@ public void SetRenderTargets(params RenderTargetView[] renderTargetViews)
11861196

11871197
CommonSetRenderTargets(renderTargetViews);
11881198
currentDepthStencilView = null;
1189-
outputMergerStage.SetTargets(renderTargetViews);
1199+
OutputMergerStage.SetTargets(renderTargetViews);
11901200
}
11911201

11921202
/// <summary>
@@ -1203,7 +1213,7 @@ public void SetRenderTargets(RenderTargetView renderTargetView)
12031213
{
12041214
CommonSetRenderTargets(renderTargetView);
12051215
currentDepthStencilView = null;
1206-
outputMergerStage.SetTargets(renderTargetView);
1216+
OutputMergerStage.SetTargets(renderTargetView);
12071217
}
12081218

12091219
/// <summary>
@@ -1226,7 +1236,7 @@ public void SetRenderTargets(DepthStencilView depthStencilView, params RenderTar
12261236

12271237
CommonSetRenderTargets(renderTargetViews);
12281238
currentDepthStencilView = depthStencilView;
1229-
outputMergerStage.SetTargets(depthStencilView, renderTargetViews);
1239+
OutputMergerStage.SetTargets(depthStencilView, renderTargetViews);
12301240
}
12311241

12321242
/// <summary>
@@ -1244,7 +1254,7 @@ public void SetRenderTargets(DepthStencilView depthStencilView, RenderTargetView
12441254
{
12451255
CommonSetRenderTargets(renderTargetView);
12461256
currentDepthStencilView = depthStencilView;
1247-
outputMergerStage.SetTargets(depthStencilView, renderTargetView);
1257+
OutputMergerStage.SetTargets(depthStencilView, renderTargetView);
12481258
}
12491259

12501260
/// <summary>
@@ -1261,7 +1271,7 @@ public void SetRenderTargets(DepthStencilView depthStencilView, RenderTargetView
12611271
/// <unmanaged-short>ID3D11DeviceContext::IASetIndexBuffer</unmanaged-short>
12621272
public void SetIndexBuffer(Buffer indexBuffer, bool is32Bit, int offset = 0)
12631273
{
1264-
inputAssemblerStage.SetIndexBuffer(indexBuffer, is32Bit ? DXGI.Format.R32_UInt : DXGI.Format.R16_UInt, offset);
1274+
InputAssemblerStage.SetIndexBuffer(indexBuffer, is32Bit ? DXGI.Format.R32_UInt : DXGI.Format.R16_UInt, offset);
12651275
}
12661276

12671277
/// <summary>
@@ -1317,7 +1327,7 @@ public unsafe void SetVertexBuffer<T>(int slot, Buffer<T> vertexBuffer, int vert
13171327
if ((slot + 1) > maxSlotCountForVertexBuffer)
13181328
maxSlotCountForVertexBuffer = slot + 1;
13191329
}
1320-
inputAssemblerStage.SetVertexBuffers(slot, 1, new IntPtr(&vertexBufferPtr), new IntPtr(&stride), new IntPtr(&offset));
1330+
InputAssemblerStage.SetVertexBuffers(slot, 1, new IntPtr(&vertexBufferPtr), new IntPtr(&stride), new IntPtr(&offset));
13211331
}
13221332

13231333
/// <summary>
@@ -1344,7 +1354,7 @@ public unsafe void SetVertexBuffer(int slot, SharpDX.Direct3D11.Buffer vertexBuf
13441354
if ((slot+1) > maxSlotCountForVertexBuffer)
13451355
maxSlotCountForVertexBuffer = slot + 1;
13461356
}
1347-
inputAssemblerStage.SetVertexBuffers(slot, 1, new IntPtr(&vertexBufferPtr), new IntPtr(&vertexStride), new IntPtr(&offsetInBytes));
1357+
InputAssemblerStage.SetVertexBuffers(slot, 1, new IntPtr(&vertexBufferPtr), new IntPtr(&vertexStride), new IntPtr(&offsetInBytes));
13481358
}
13491359

13501360
/// <summary>
@@ -1362,7 +1372,7 @@ public void ResetVertexBuffers()
13621372
if (maxSlotCountForVertexBuffer == 0)
13631373
return;
13641374

1365-
inputAssemblerStage.SetVertexBuffers(0, maxSlotCountForVertexBuffer, resetVertexBuffersPointer, resetVertexBuffersPointer, resetVertexBuffersPointer);
1375+
InputAssemblerStage.SetVertexBuffers(0, maxSlotCountForVertexBuffer, resetVertexBuffersPointer, resetVertexBuffersPointer, resetVertexBuffersPointer);
13661376

13671377
maxSlotCountForVertexBuffer = 0;
13681378
}
@@ -1415,7 +1425,7 @@ private void SetupInputLayout()
14151425
throw new InvalidOperationException("Cannot perform a Draw/Dispatch operation without an EffectPass applied.");
14161426

14171427
var inputLayout = CurrentPass.GetInputLayout(currentVertexInputLayout);
1418-
inputAssemblerStage.SetInputLayout(inputLayout);
1428+
InputAssemblerStage.SetInputLayout(inputLayout);
14191429
}
14201430

14211431
/// <summary>

Source/Toolkit/SharpDX.Toolkit.Graphics/PrimitiveQuad.cs

+16
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ public void Draw()
8787
GraphicsDevice.SetVertexBuffer(sharedData.VertexBuffer);
8888
GraphicsDevice.SetVertexInputLayout(sharedData.VertexInputLayout);
8989

90+
ResetShaderStages();
91+
9092
// Make sure that we are using our vertex shader
9193
quadPass.Apply();
9294
GraphicsDevice.Draw(PrimitiveType.TriangleStrip, 4);
@@ -102,6 +104,8 @@ public void Draw(SharpDX.Direct3D11.ShaderResourceView texture, SharpDX.Direct3D
102104
GraphicsDevice.SetVertexBuffer(sharedData.VertexBuffer);
103105
GraphicsDevice.SetVertexInputLayout(sharedData.VertexInputLayout);
104106

107+
ResetShaderStages();
108+
105109
// Make sure that we are using our vertex shader
106110
textureParameter.SetResource(texture);
107111
textureSamplerParameter.SetResource(samplerState ?? GraphicsDevice.SamplerStates.LinearClamp);
@@ -117,6 +121,8 @@ public void Draw(Effect effect)
117121
{
118122
GraphicsDevice.SetVertexBuffer(sharedData.VertexBuffer);
119123
GraphicsDevice.SetVertexInputLayout(sharedData.VertexInputLayout);
124+
ResetShaderStages();
125+
120126
foreach (var pass in effect.CurrentTechnique.Passes)
121127
{
122128
// Apply the Effect pass
@@ -135,11 +141,21 @@ public void Draw(Effect effect)
135141
/// <param name="effectPass">The effect pass.</param>
136142
public void Draw(EffectPass effectPass)
137143
{
144+
ResetShaderStages();
145+
138146
// Apply the Effect pass
139147
effectPass.Apply();
140148
Draw();
141149
}
142150

151+
private void ResetShaderStages()
152+
{
153+
// Make sure that domain, hull and geometry shaders are disable.
154+
GraphicsDevice.DomainShaderStage.Set(null);
155+
GraphicsDevice.HullShaderStage.Set(null);
156+
GraphicsDevice.GeometryShaderStage.Set(null);
157+
}
158+
143159
/// <summary>
144160
/// Internal structure used to store VertexBuffer and VertexInputLayout.
145161
/// </summary>

Source/Toolkit/SharpDX.Toolkit.Graphics/StockEffects/C#/BasicEffect.cs

+5
Original file line numberDiff line numberDiff line change
@@ -542,6 +542,11 @@ public void EnableDefaultLighting()
542542
/// </summary>
543543
protected internal override EffectPass OnApply(EffectPass pass)
544544
{
545+
// Make sure that domain, hull and geometry shaders are disable.
546+
GraphicsDevice.DomainShaderStage.Set(null);
547+
GraphicsDevice.HullShaderStage.Set(null);
548+
GraphicsDevice.GeometryShaderStage.Set(null);
549+
545550
// Recompute the world+view+projection matrix or fog vector?
546551
dirtyFlags = EffectHelpers.SetWorldViewProjAndFog(dirtyFlags, ref world, ref view, ref projection, ref worldView, fogEnabled, fogStart, fogEnd, worldViewProjParam, fogVectorParam);
547552

0 commit comments

Comments
 (0)