mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-12-24 10:48:53 +01:00
internal/graphicsdriver/directx: initialize a device for Xbox
Updates #1162
This commit is contained in:
parent
59798d29f4
commit
d4226659ee
@ -19,12 +19,17 @@ import (
|
|||||||
"math"
|
"math"
|
||||||
"reflect"
|
"reflect"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
"sync"
|
||||||
"syscall"
|
"syscall"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
"golang.org/x/sys/windows"
|
"golang.org/x/sys/windows"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
_BOOL int32
|
||||||
|
)
|
||||||
|
|
||||||
func boolToUintptr(v bool) uintptr {
|
func boolToUintptr(v bool) uintptr {
|
||||||
if v {
|
if v {
|
||||||
return 1
|
return 1
|
||||||
@ -49,6 +54,10 @@ const (
|
|||||||
_D3D12_MIN_DEPTH = 0.0
|
_D3D12_MIN_DEPTH = 0.0
|
||||||
_D3D12_REQ_TEXTURE2D_U_OR_V_DIMENSION = 16384
|
_D3D12_REQ_TEXTURE2D_U_OR_V_DIMENSION = 16384
|
||||||
_D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES = 0xffffffff
|
_D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES = 0xffffffff
|
||||||
|
_D3D12_SDK_VERSION = (_D3D12_SDK_VERSION_MAJOR << 16) | _D3D12_SDK_VERSION_MINOR
|
||||||
|
_D3D12_SDK_VERSION_MAJOR = 2
|
||||||
|
_D3D12_SDK_VERSION_MINOR = 4
|
||||||
|
_D3D12XBOX_DEFAULT_SIZE_BYTES = 0xffffffff
|
||||||
)
|
)
|
||||||
|
|
||||||
type _D3D_FEATURE_LEVEL int32
|
type _D3D_FEATURE_LEVEL int32
|
||||||
@ -471,6 +480,21 @@ const (
|
|||||||
_D3D12_TEXTURE_LAYOUT_64KB_STANDARD_SWIZZLE _D3D12_TEXTURE_LAYOUT = 3
|
_D3D12_TEXTURE_LAYOUT_64KB_STANDARD_SWIZZLE _D3D12_TEXTURE_LAYOUT = 3
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type _D3D12XBOX_CREATE_DEVICE_FLAGS int32
|
||||||
|
|
||||||
|
type _D3D12XBOX_PROCESS_DEBUG_FLAGS int32
|
||||||
|
|
||||||
|
const (
|
||||||
|
_D3D12XBOX_PROCESS_DEBUG_FLAG_NONE _D3D12XBOX_PROCESS_DEBUG_FLAGS = 0x0
|
||||||
|
_D3D12XBOX_PROCESS_DEBUG_FLAG_DEBUG _D3D12XBOX_PROCESS_DEBUG_FLAGS = 0x00000001
|
||||||
|
_D3D12_PROCESS_DEBUG_FLAG_DEBUG_LAYER_ENABLED _D3D12XBOX_PROCESS_DEBUG_FLAGS = _D3D12XBOX_PROCESS_DEBUG_FLAG_DEBUG
|
||||||
|
_D3D12XBOX_PROCESS_DEBUG_FLAG_INSTRUMENTED _D3D12XBOX_PROCESS_DEBUG_FLAGS = 0x00100000
|
||||||
|
_D3D12XBOX_PROCESS_DEBUG_FLAG_VALIDATED _D3D12XBOX_PROCESS_DEBUG_FLAGS = _D3D12XBOX_PROCESS_DEBUG_FLAG_DEBUG
|
||||||
|
_D3D12XBOX_PROCESS_DEBUG_FLAG_NULL_GPU _D3D12XBOX_PROCESS_DEBUG_FLAGS = 0x00400000
|
||||||
|
_D3D12XBOX_PROCESS_DEBUG_FLAG_ENABLE_COMMON_STATE_PROMOTION _D3D12XBOX_PROCESS_DEBUG_FLAGS = 0x01000000
|
||||||
|
_D3D12XBOX_PROCESS_DEBUG_FLAG_ENHANCED_VALIDATION _D3D12XBOX_PROCESS_DEBUG_FLAGS = 0x02000000
|
||||||
|
)
|
||||||
|
|
||||||
type _DXGI_ALPHA_MODE uint32
|
type _DXGI_ALPHA_MODE uint32
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -537,8 +561,8 @@ var (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type _D3D12_BLEND_DESC struct {
|
type _D3D12_BLEND_DESC struct {
|
||||||
AlphaToCoverageEnable int32
|
AlphaToCoverageEnable _BOOL
|
||||||
IndependentBlendEnable int32
|
IndependentBlendEnable _BOOL
|
||||||
RenderTarget [8]_D3D12_RENDER_TARGET_BLEND_DESC
|
RenderTarget [8]_D3D12_RENDER_TARGET_BLEND_DESC
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -584,10 +608,10 @@ type _D3D12_DEPTH_STENCIL_VIEW_DESC struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type _D3D12_DEPTH_STENCIL_DESC struct {
|
type _D3D12_DEPTH_STENCIL_DESC struct {
|
||||||
DepthEnable int32
|
DepthEnable _BOOL
|
||||||
DepthWriteMask _D3D12_DEPTH_WRITE_MASK
|
DepthWriteMask _D3D12_DEPTH_WRITE_MASK
|
||||||
DepthFunc _D3D12_COMPARISON_FUNC
|
DepthFunc _D3D12_COMPARISON_FUNC
|
||||||
StencilEnable int32
|
StencilEnable _BOOL
|
||||||
StencilReadMask uint8
|
StencilReadMask uint8
|
||||||
StencilWriteMask uint8
|
StencilWriteMask uint8
|
||||||
FrontFace _D3D12_DEPTH_STENCILOP_DESC
|
FrontFace _D3D12_DEPTH_STENCILOP_DESC
|
||||||
@ -680,13 +704,13 @@ type _D3D12_RANGE struct {
|
|||||||
type _D3D12_RASTERIZER_DESC struct {
|
type _D3D12_RASTERIZER_DESC struct {
|
||||||
FillMode _D3D12_FILL_MODE
|
FillMode _D3D12_FILL_MODE
|
||||||
CullMode _D3D12_CULL_MODE
|
CullMode _D3D12_CULL_MODE
|
||||||
FrontCounterClockwise int32
|
FrontCounterClockwise _BOOL
|
||||||
DepthBias int32
|
DepthBias int32
|
||||||
DepthBiasClamp float32
|
DepthBiasClamp float32
|
||||||
SlopeScaledDepthBias float32
|
SlopeScaledDepthBias float32
|
||||||
DepthClipEnable int32
|
DepthClipEnable _BOOL
|
||||||
MultisampleEnable int32
|
MultisampleEnable _BOOL
|
||||||
AntialiasedLineEnable int32
|
AntialiasedLineEnable _BOOL
|
||||||
ForcedSampleCount uint32
|
ForcedSampleCount uint32
|
||||||
ConservativeRaster _D3D12_CONSERVATIVE_RASTERIZATION_MODE
|
ConservativeRaster _D3D12_CONSERVATIVE_RASTERIZATION_MODE
|
||||||
}
|
}
|
||||||
@ -829,15 +853,52 @@ type _D3D12_VIEWPORT struct {
|
|||||||
MaxDepth float32
|
MaxDepth float32
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type _D3D12XBOX_CREATE_DEVICE_PARAMETERS struct {
|
||||||
|
Version uint32
|
||||||
|
ProcessDebugFlags _D3D12XBOX_PROCESS_DEBUG_FLAGS
|
||||||
|
GraphicsCommandQueueRingSizeBytes uint32
|
||||||
|
pOffchipTessellationBuffer _D3D12_GPU_VIRTUAL_ADDRESS
|
||||||
|
GraphicsScratchMemorySizeBytes uint32
|
||||||
|
ComputeScratchMemorySizeBytes uint32
|
||||||
|
DisableGeometryShaderAllocations _BOOL
|
||||||
|
DisableTessellationShaderAllocations _BOOL
|
||||||
|
|
||||||
|
// These members are for Xbox Series.
|
||||||
|
DisableDXR _BOOL
|
||||||
|
DisableAutomaticDPBBBreakBatchEvents _BOOL
|
||||||
|
pDXRStackBuffer _D3D12_GPU_VIRTUAL_ADDRESS
|
||||||
|
DXRStackBufferOverrideSizeBytes uint32
|
||||||
|
CreateDeviceFlags _D3D12XBOX_CREATE_DEVICE_FLAGS
|
||||||
|
AutoHDRPaperWhiteLevelNits uint32
|
||||||
|
DisableAutomaticCommandSegmentChaining _BOOL
|
||||||
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
d3d12 = windows.NewLazySystemDLL("d3d12.dll")
|
d3d12 = windows.NewLazySystemDLL("d3d12.dll")
|
||||||
d3dcompiler = windows.NewLazySystemDLL("d3dcompiler_47.dll")
|
d3dcompiler = windows.NewLazySystemDLL("d3dcompiler_47.dll")
|
||||||
dxgi = windows.NewLazySystemDLL("dxgi.dll")
|
dxgi = windows.NewLazySystemDLL("dxgi.dll")
|
||||||
|
|
||||||
|
d3d12xDLL *windows.LazyDLL
|
||||||
|
d3d12xOnce sync.Once
|
||||||
|
)
|
||||||
|
|
||||||
|
func d3d12x() *windows.LazyDLL {
|
||||||
|
d3d12xOnce.Do(func() {
|
||||||
|
d3d12xDLL = windows.NewLazySystemDLL("d3d12_xs.dll")
|
||||||
|
if d3d12xDLL.Load() != nil {
|
||||||
|
d3d12xDLL = windows.NewLazySystemDLL("d3d12_x.dll")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return d3d12xDLL
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
procD3D12CreateDevice = d3d12.NewProc("D3D12CreateDevice")
|
procD3D12CreateDevice = d3d12.NewProc("D3D12CreateDevice")
|
||||||
procD3D12GetDebugInterface = d3d12.NewProc("D3D12GetDebugInterface")
|
procD3D12GetDebugInterface = d3d12.NewProc("D3D12GetDebugInterface")
|
||||||
procD3D12SerializeRootSignature = d3d12.NewProc("D3D12SerializeRootSignature")
|
procD3D12SerializeRootSignature = d3d12.NewProc("D3D12SerializeRootSignature")
|
||||||
|
|
||||||
|
procD3D12XboxCreateDevice = d3d12x().NewProc("D3D12XboxCreateDevice")
|
||||||
|
|
||||||
procD3DCompile = d3dcompiler.NewProc("D3DCompile")
|
procD3DCompile = d3dcompiler.NewProc("D3DCompile")
|
||||||
|
|
||||||
procCreateDXGIFactory2 = dxgi.NewProc("CreateDXGIFactory2")
|
procCreateDXGIFactory2 = dxgi.NewProc("CreateDXGIFactory2")
|
||||||
@ -877,6 +938,14 @@ func _D3D12SerializeRootSignature(pRootSignature *_D3D12_ROOT_SIGNATURE_DESC, ve
|
|||||||
return blob, nil
|
return blob, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func _D3D12XboxCreateDevice(pAdapter unsafe.Pointer, pParameters *_D3D12XBOX_CREATE_DEVICE_PARAMETERS, riid *windows.GUID, ppDevice *unsafe.Pointer) error {
|
||||||
|
r, _, _ := procD3D12XboxCreateDevice.Call(uintptr(pAdapter), uintptr(unsafe.Pointer(pParameters)), uintptr(unsafe.Pointer(riid)), uintptr(unsafe.Pointer(ppDevice)))
|
||||||
|
if windows.Handle(r) != windows.S_OK {
|
||||||
|
return fmt.Errorf("directx: D3D12XboxCreateDevice failed: %w", windows.Errno(r))
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func _D3DCompile(srcData []byte, sourceName string, pDefines []_D3D_SHADER_MACRO, pInclude unsafe.Pointer, entryPoint string, target string, flags1 uint32, flags2 uint32) (*_ID3DBlob, error) {
|
func _D3DCompile(srcData []byte, sourceName string, pDefines []_D3D_SHADER_MACRO, pInclude unsafe.Pointer, entryPoint string, target string, flags1 uint32, flags2 uint32) (*_ID3DBlob, error) {
|
||||||
// TODO: Define _ID3DInclude for pInclude, but is it possible in Go?
|
// TODO: Define _ID3DInclude for pInclude, but is it possible in Go?
|
||||||
|
|
||||||
@ -943,8 +1012,8 @@ type _D3D12_PLACED_SUBRESOURCE_FOOTPRINT struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type _D3D12_RENDER_TARGET_BLEND_DESC struct {
|
type _D3D12_RENDER_TARGET_BLEND_DESC struct {
|
||||||
BlendEnable int32
|
BlendEnable _BOOL
|
||||||
LogicOpEnable int32
|
LogicOpEnable _BOOL
|
||||||
SrcBlend _D3D12_BLEND
|
SrcBlend _D3D12_BLEND
|
||||||
DestBlend _D3D12_BLEND
|
DestBlend _D3D12_BLEND
|
||||||
BlendOp _D3D12_BLEND_OP
|
BlendOp _D3D12_BLEND_OP
|
||||||
@ -999,7 +1068,7 @@ type _DXGI_SWAP_CHAIN_FULLSCREEN_DESC struct {
|
|||||||
RefreshRate _DXGI_RATIONAL
|
RefreshRate _DXGI_RATIONAL
|
||||||
ScanlineOrdering _DXGI_MODE_SCANLINE_ORDER
|
ScanlineOrdering _DXGI_MODE_SCANLINE_ORDER
|
||||||
Scaling _DXGI_MODE_SCALING
|
Scaling _DXGI_MODE_SCALING
|
||||||
Windowed int32
|
Windowed _BOOL
|
||||||
}
|
}
|
||||||
|
|
||||||
type _DXGI_RATIONAL struct {
|
type _DXGI_RATIONAL struct {
|
||||||
@ -1016,7 +1085,7 @@ type _DXGI_SWAP_CHAIN_DESC1 struct {
|
|||||||
Width uint32
|
Width uint32
|
||||||
Height uint32
|
Height uint32
|
||||||
Format _DXGI_FORMAT
|
Format _DXGI_FORMAT
|
||||||
Stereo int32
|
Stereo _BOOL
|
||||||
SampleDesc _DXGI_SAMPLE_DESC
|
SampleDesc _DXGI_SAMPLE_DESC
|
||||||
BufferUsage _DXGI_USAGE
|
BufferUsage _DXGI_USAGE
|
||||||
BufferCount uint32
|
BufferCount uint32
|
||||||
|
@ -27,14 +27,15 @@ import (
|
|||||||
|
|
||||||
"github.com/hajimehoshi/ebiten/v2/internal/graphics"
|
"github.com/hajimehoshi/ebiten/v2/internal/graphics"
|
||||||
"github.com/hajimehoshi/ebiten/v2/internal/graphicsdriver"
|
"github.com/hajimehoshi/ebiten/v2/internal/graphicsdriver"
|
||||||
|
"github.com/hajimehoshi/ebiten/v2/internal/microsoftgdk"
|
||||||
"github.com/hajimehoshi/ebiten/v2/internal/shaderir"
|
"github.com/hajimehoshi/ebiten/v2/internal/shaderir"
|
||||||
"github.com/hajimehoshi/ebiten/v2/internal/shaderir/hlsl"
|
"github.com/hajimehoshi/ebiten/v2/internal/shaderir/hlsl"
|
||||||
)
|
)
|
||||||
|
|
||||||
const frameCount = 2
|
const frameCount = 2
|
||||||
|
|
||||||
// isDirectXAvailable indicates whether DirectX is available or not.
|
|
||||||
var (
|
var (
|
||||||
|
// isDirectXAvailable indicates whether DirectX is available or not.
|
||||||
isDirectXAvailable bool
|
isDirectXAvailable bool
|
||||||
isDirectXAvailableOnce sync.Once
|
isDirectXAvailableOnce sync.Once
|
||||||
)
|
)
|
||||||
@ -159,12 +160,26 @@ func (g *Graphics) initializeDevice() (ferr error) {
|
|||||||
for _, t := range strings.Split(os.Getenv("EBITEN_DIRECTX"), ",") {
|
for _, t := range strings.Split(os.Getenv("EBITEN_DIRECTX"), ",") {
|
||||||
switch strings.TrimSpace(t) {
|
switch strings.TrimSpace(t) {
|
||||||
case "warp":
|
case "warp":
|
||||||
|
// TODO: Is WARP available on Xbox?
|
||||||
useWARP = true
|
useWARP = true
|
||||||
case "debug":
|
case "debug":
|
||||||
useDebugLayer = true
|
useDebugLayer = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if microsoftgdk.IsXbox() {
|
||||||
|
if err := g.initializeDeviceXbox(useWARP, useDebugLayer); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if err := g.initializeDeviceDesktop(useWARP, useDebugLayer); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *Graphics) initializeDeviceDesktop(useWARP bool, useDebugLayer bool) (ferr error) {
|
||||||
if err := d3d12.Load(); err != nil {
|
if err := d3d12.Load(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -261,6 +276,27 @@ func (g *Graphics) initializeDevice() (ferr error) {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (g *Graphics) initializeDeviceXbox(useWARP bool, useDebugLayer bool) (ferr error) {
|
||||||
|
if err := d3d12x().Load(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
params := &_D3D12XBOX_CREATE_DEVICE_PARAMETERS{
|
||||||
|
Version: _D3D12_SDK_VERSION, // TODO: Can we always use the same value?
|
||||||
|
GraphicsCommandQueueRingSizeBytes: _D3D12XBOX_DEFAULT_SIZE_BYTES,
|
||||||
|
GraphicsScratchMemorySizeBytes: _D3D12XBOX_DEFAULT_SIZE_BYTES,
|
||||||
|
ComputeScratchMemorySizeBytes: _D3D12XBOX_DEFAULT_SIZE_BYTES,
|
||||||
|
}
|
||||||
|
if useDebugLayer {
|
||||||
|
params.ProcessDebugFlags = _D3D12_PROCESS_DEBUG_FLAG_DEBUG_LAYER_ENABLED
|
||||||
|
}
|
||||||
|
if err := _D3D12XboxCreateDevice(nil, params, &_IID_ID3D12Device, (*unsafe.Pointer)(unsafe.Pointer(&g.device))); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (g *Graphics) Initialize() (ferr error) {
|
func (g *Graphics) Initialize() (ferr error) {
|
||||||
// Create an event for a fence.
|
// Create an event for a fence.
|
||||||
e, err := windows.CreateEvent(nil, 0, 0, nil)
|
e, err := windows.CreateEvent(nil, 0, 0, nil)
|
||||||
|
Loading…
Reference in New Issue
Block a user