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 { func (g *graphics11) setAsRenderTargets(dsts []*image11, useStencil bool) error {
var rtvs []*_ID3D11RenderTargetView var rtvs []*_ID3D11RenderTargetView
var dsv *_ID3D11DepthStencilView var dsv *_ID3D11DepthStencilView
for _, i := range dsts { for _, dst := range dsts {
// Ignore a nil image in case of MRT // Ignore a nil image in case of MRT
if i == nil { if dst == nil {
rtvs = append(rtvs, nil) rtvs = append(rtvs, nil)
continue continue
} }
if i.renderTargetView == nil { if dst.renderTargetView == nil {
rtv, err := g.device.CreateRenderTargetView(unsafe.Pointer(i.texture), nil) rtv, err := g.device.CreateRenderTargetView(unsafe.Pointer(dst.texture), nil)
if err != nil { if err != nil {
return err return err
} }
i.renderTargetView = rtv dst.renderTargetView = rtv
} }
rtvs = append(rtvs, i.renderTargetView) rtvs = append(rtvs, dst.renderTargetView)
if !useStencil || dsv != nil { if !useStencil || dsv != nil {
continue continue
} }
if i.screen { if dst.screen {
return fmt.Errorf("directx: a stencil buffer is not available for a screen image") return fmt.Errorf("directx: a stencil buffer is not available for a screen image")
} }
if i.stencil == nil { if dst.stencil == nil {
w, h := i.internalSize() w, h := dst.internalSize()
s, err := g.device.CreateTexture2D(&_D3D11_TEXTURE2D_DESC{ s, err := g.device.CreateTexture2D(&_D3D11_TEXTURE2D_DESC{
Width: uint32(w), Width: uint32(w),
Height: uint32(h), Height: uint32(h),
@ -560,16 +560,16 @@ func (g *graphics11) setAsRenderTargets(dsts []*image11, useStencil bool) error
if err != nil { if err != nil {
return err return err
} }
i.stencil = s dst.stencil = s
} }
if i.stencilView == nil { if dst.stencilView == nil {
sv, err := g.device.CreateDepthStencilView(unsafe.Pointer(i.stencil), nil) sv, err := g.device.CreateDepthStencilView(unsafe.Pointer(dst.stencil), nil)
if err != nil { if err != nil {
return err return err
} }
i.stencilView = sv dst.stencilView = sv
dsv = sv
} }
dsv = dst.stencilView
} }
g.deviceContext.OMSetRenderTargets(rtvs, dsv) 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 { func (g *graphics12) setAsRenderTargets(dsts []*image12, useStencil bool) error {
var rtvs []_D3D12_CPU_DESCRIPTOR_HANDLE var rtvs []_D3D12_CPU_DESCRIPTOR_HANDLE
var dsvPtr *_D3D12_CPU_DESCRIPTOR_HANDLE var dsv *_D3D12_CPU_DESCRIPTOR_HANDLE
for i, img := range dsts { for i, img := range dsts {
// Ignore a nil image in case of MRT // Ignore a nil image in case of MRT
@ -1127,18 +1127,18 @@ func (g *graphics12) setAsRenderTargets(dsts []*image12, useStencil bool) error
rtv := rtvBase rtv := rtvBase
rtvs = append(rtvs, rtv) rtvs = append(rtvs, rtv)
if !useStencil || dsvPtr != nil { if !useStencil || dsv != nil {
continue continue
} }
if err := img.ensureDepthStencilView(g.device); err != nil { if err := img.ensureDepthStencilView(g.device); err != nil {
return err return err
} }
dsv, err := img.dsvDescriptorHeap.GetCPUDescriptorHandleForHeapStart() sv, err := img.dsvDescriptorHeap.GetCPUDescriptorHandleForHeapStart()
if err != nil { if err != nil {
return err return err
} }
dsvPtr = &dsv dsv = &sv
} }
if !useStencil { if !useStencil {
@ -1147,8 +1147,8 @@ func (g *graphics12) setAsRenderTargets(dsts []*image12, useStencil bool) error
} }
g.drawCommandList.OMSetStencilRef(0) g.drawCommandList.OMSetStencilRef(0)
g.drawCommandList.OMSetRenderTargets(rtvs, false, dsvPtr) g.drawCommandList.OMSetRenderTargets(rtvs, false, dsv)
g.drawCommandList.ClearDepthStencilView(*dsvPtr, _D3D12_CLEAR_FLAG_STENCIL, 0, 0, nil) g.drawCommandList.ClearDepthStencilView(*dsv, _D3D12_CLEAR_FLAG_STENCIL, 0, 0, nil)
return nil return nil
} }