Fixed stencil tests for directx

This commit is contained in:
Zyko 2024-04-13 14:23:17 +02:00
parent dbe06ec468
commit dc6074bec9
2 changed files with 20 additions and 20 deletions

View File

@ -518,30 +518,30 @@ func (g *graphics11) removeShader(s *shader11) {
func (g *graphics11) setAsRenderTargets(dsts []*image11, useStencil bool) error {
var rtvs []*_ID3D11RenderTargetView
var dsv *_ID3D11DepthStencilView
for _, i := range dsts {
for _, dst := range dsts {
// Ignore a nil image in case of MRT
if i == nil {
if dst == nil {
rtvs = append(rtvs, nil)
continue
}
if i.renderTargetView == nil {
rtv, err := g.device.CreateRenderTargetView(unsafe.Pointer(i.texture), nil)
if dst.renderTargetView == nil {
rtv, err := g.device.CreateRenderTargetView(unsafe.Pointer(dst.texture), nil)
if err != nil {
return err
}
i.renderTargetView = rtv
dst.renderTargetView = rtv
}
rtvs = append(rtvs, i.renderTargetView)
rtvs = append(rtvs, dst.renderTargetView)
if !useStencil || dsv != nil {
continue
}
if i.screen {
if dst.screen {
return fmt.Errorf("directx: a stencil buffer is not available for a screen image")
}
if i.stencil == nil {
w, h := i.internalSize()
if dst.stencil == nil {
w, h := dst.internalSize()
s, err := g.device.CreateTexture2D(&_D3D11_TEXTURE2D_DESC{
Width: uint32(w),
Height: uint32(h),
@ -560,16 +560,16 @@ func (g *graphics11) setAsRenderTargets(dsts []*image11, useStencil bool) error
if err != nil {
return err
}
i.stencil = s
dst.stencil = s
}
if i.stencilView == nil {
sv, err := g.device.CreateDepthStencilView(unsafe.Pointer(i.stencil), nil)
if dst.stencilView == nil {
sv, err := g.device.CreateDepthStencilView(unsafe.Pointer(dst.stencil), nil)
if err != nil {
return err
}
i.stencilView = sv
dsv = sv
dst.stencilView = sv
}
dsv = dst.stencilView
}
g.deviceContext.OMSetRenderTargets(rtvs, dsv)

View File

@ -1084,7 +1084,7 @@ func (g *graphics12) NewShader(program *shaderir.Program) (graphicsdriver.Shader
func (g *graphics12) setAsRenderTargets(dsts []*image12, useStencil bool) error {
var rtvs []_D3D12_CPU_DESCRIPTOR_HANDLE
var dsvPtr *_D3D12_CPU_DESCRIPTOR_HANDLE
var dsv *_D3D12_CPU_DESCRIPTOR_HANDLE
for i, img := range dsts {
// Ignore a nil image in case of MRT
@ -1127,18 +1127,18 @@ func (g *graphics12) setAsRenderTargets(dsts []*image12, useStencil bool) error
rtv := rtvBase
rtvs = append(rtvs, rtv)
if !useStencil || dsvPtr != nil {
if !useStencil || dsv != nil {
continue
}
if err := img.ensureDepthStencilView(g.device); err != nil {
return err
}
dsv, err := img.dsvDescriptorHeap.GetCPUDescriptorHandleForHeapStart()
sv, err := img.dsvDescriptorHeap.GetCPUDescriptorHandleForHeapStart()
if err != nil {
return err
}
dsvPtr = &dsv
dsv = &sv
}
if !useStencil {
@ -1147,8 +1147,8 @@ func (g *graphics12) setAsRenderTargets(dsts []*image12, useStencil bool) error
}
g.drawCommandList.OMSetStencilRef(0)
g.drawCommandList.OMSetRenderTargets(rtvs, false, dsvPtr)
g.drawCommandList.ClearDepthStencilView(*dsvPtr, _D3D12_CLEAR_FLAG_STENCIL, 0, 0, nil)
g.drawCommandList.OMSetRenderTargets(rtvs, false, dsv)
g.drawCommandList.ClearDepthStencilView(*dsv, _D3D12_CLEAR_FLAG_STENCIL, 0, 0, nil)
return nil
}