mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2025-01-26 02:42:02 +01:00
internal/graphicsdriver/directx: skip unnecessary flushing commands
Updates #2034 Updates #2188
This commit is contained in:
parent
bd72ca971e
commit
a32a137fa8
@ -114,9 +114,13 @@ type Graphics struct {
|
|||||||
// drawCommandList is a command list for a 3D engine (DrawIndexedInstanced).
|
// drawCommandList is a command list for a 3D engine (DrawIndexedInstanced).
|
||||||
drawCommandList *_ID3D12GraphicsCommandList
|
drawCommandList *_ID3D12GraphicsCommandList
|
||||||
|
|
||||||
|
needFlushDrawCommandList bool
|
||||||
|
|
||||||
// copyCommandList is a command list for a copy engine (CopyTextureRegion).
|
// copyCommandList is a command list for a copy engine (CopyTextureRegion).
|
||||||
copyCommandList *_ID3D12GraphicsCommandList
|
copyCommandList *_ID3D12GraphicsCommandList
|
||||||
|
|
||||||
|
needFlushCopyCommandList bool
|
||||||
|
|
||||||
// drawCommandList and copyCommandList are exclusive: if one is not empty, the other must be empty.
|
// drawCommandList and copyCommandList are exclusive: if one is not empty, the other must be empty.
|
||||||
|
|
||||||
vertices [frameCount][]*_ID3D12Resource
|
vertices [frameCount][]*_ID3D12Resource
|
||||||
@ -864,6 +868,19 @@ func (g *Graphics) resetCommandAllocators(frameIndex int) error {
|
|||||||
//
|
//
|
||||||
// TODO: This is not efficient. Is it possible to make two command lists work in parallel?
|
// TODO: This is not efficient. Is it possible to make two command lists work in parallel?
|
||||||
func (g *Graphics) flushCommandList(commandList *_ID3D12GraphicsCommandList) error {
|
func (g *Graphics) flushCommandList(commandList *_ID3D12GraphicsCommandList) error {
|
||||||
|
switch commandList {
|
||||||
|
case g.drawCommandList:
|
||||||
|
if !g.needFlushDrawCommandList {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
g.needFlushDrawCommandList = false
|
||||||
|
case g.copyCommandList:
|
||||||
|
if !g.needFlushCopyCommandList {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
g.needFlushCopyCommandList = false
|
||||||
|
}
|
||||||
|
|
||||||
if err := commandList.Close(); err != nil {
|
if err := commandList.Close(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -1227,6 +1244,7 @@ func (g *Graphics) DrawTriangles(dstID graphicsdriver.ImageID, srcs [graphics.Sh
|
|||||||
}
|
}
|
||||||
|
|
||||||
w, h := dst.internalSize()
|
w, h := dst.internalSize()
|
||||||
|
g.needFlushDrawCommandList = true
|
||||||
g.drawCommandList.RSSetViewports([]_D3D12_VIEWPORT{
|
g.drawCommandList.RSSetViewports([]_D3D12_VIEWPORT{
|
||||||
{
|
{
|
||||||
TopLeftX: 0,
|
TopLeftX: 0,
|
||||||
@ -1470,6 +1488,7 @@ func (i *Image) ReadPixels(buf []byte) error {
|
|||||||
Type: _D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX,
|
Type: _D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX,
|
||||||
SubresourceIndex: 0,
|
SubresourceIndex: 0,
|
||||||
}
|
}
|
||||||
|
i.graphics.needFlushCopyCommandList = true
|
||||||
i.graphics.copyCommandList.CopyTextureRegion_PlacedFootPrint_SubresourceIndex(
|
i.graphics.copyCommandList.CopyTextureRegion_PlacedFootPrint_SubresourceIndex(
|
||||||
&dst, 0, 0, 0, &src, &_D3D12_BOX{
|
&dst, 0, 0, 0, &src, &_D3D12_BOX{
|
||||||
left: 0,
|
left: 0,
|
||||||
@ -1519,6 +1538,8 @@ func (i *Image) ReplacePixels(args []*graphicsdriver.ReplacePixelsArgs) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
i.graphics.needFlushCopyCommandList = true
|
||||||
|
|
||||||
var srcBytes []byte
|
var srcBytes []byte
|
||||||
h := (*reflect.SliceHeader)(unsafe.Pointer(&srcBytes))
|
h := (*reflect.SliceHeader)(unsafe.Pointer(&srcBytes))
|
||||||
h.Data = uintptr(m)
|
h.Data = uintptr(m)
|
||||||
|
Loading…
Reference in New Issue
Block a user