mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2025-02-22 07:50:08 +01:00
Fixed stencil tests for directx
This commit is contained in:
parent
dbe06ec468
commit
dc6074bec9
@ -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)
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user