mirror of
https://github.com/libsdl-org/SDL.git
synced 2025-09-29 06:28:29 +00:00
d3d12: Generate Xbox C macros, adjust SDL_Render files accordingly
This commit is contained in:
@@ -435,7 +435,7 @@ static void D3D12_ReleaseAll(SDL_Renderer *renderer)
|
|||||||
/* Check for any leaks if in debug mode */
|
/* Check for any leaks if in debug mode */
|
||||||
if (data->dxgiDebug) {
|
if (data->dxgiDebug) {
|
||||||
DXGI_DEBUG_RLO_FLAGS rloFlags = (DXGI_DEBUG_RLO_FLAGS)(DXGI_DEBUG_RLO_DETAIL | DXGI_DEBUG_RLO_IGNORE_INTERNAL);
|
DXGI_DEBUG_RLO_FLAGS rloFlags = (DXGI_DEBUG_RLO_FLAGS)(DXGI_DEBUG_RLO_DETAIL | DXGI_DEBUG_RLO_IGNORE_INTERNAL);
|
||||||
D3D_CALL(data->dxgiDebug, ReportLiveObjects, SDL_DXGI_DEBUG_ALL, rloFlags);
|
IDXGIDebug_ReportLiveObjects(data->dxgiDebug, SDL_DXGI_DEBUG_ALL, rloFlags);
|
||||||
D3D_SAFE_RELEASE(data->dxgiDebug);
|
D3D_SAFE_RELEASE(data->dxgiDebug);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -473,9 +473,9 @@ static D3D12_GPU_DESCRIPTOR_HANDLE D3D12_CPUtoGPUHandle(ID3D12DescriptorHeap *he
|
|||||||
static void D3D12_WaitForGPU(D3D12_RenderData *data)
|
static void D3D12_WaitForGPU(D3D12_RenderData *data)
|
||||||
{
|
{
|
||||||
if (data->commandQueue && data->fence && data->fenceEvent) {
|
if (data->commandQueue && data->fence && data->fenceEvent) {
|
||||||
D3D_CALL(data->commandQueue, Signal, data->fence, data->fenceValue);
|
ID3D12CommandQueue_Signal(data->commandQueue, data->fence, data->fenceValue);
|
||||||
if (D3D_CALL(data->fence, GetCompletedValue) < data->fenceValue) {
|
if (ID3D12Fence_GetCompletedValue(data->fence) < data->fenceValue) {
|
||||||
D3D_CALL(data->fence, SetEventOnCompletion,
|
ID3D12Fence_SetEventOnCompletion(data->fence,
|
||||||
data->fenceValue,
|
data->fenceValue,
|
||||||
data->fenceEvent);
|
data->fenceEvent);
|
||||||
WaitForSingleObjectEx(data->fenceEvent, INFINITE, FALSE);
|
WaitForSingleObjectEx(data->fenceEvent, INFINITE, FALSE);
|
||||||
@@ -515,7 +515,7 @@ static void D3D12_TransitionResource(D3D12_RenderData *data,
|
|||||||
barrier.Transition.StateAfter = afterState;
|
barrier.Transition.StateAfter = afterState;
|
||||||
barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;
|
barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;
|
||||||
|
|
||||||
D3D_CALL(data->commandList, ResourceBarrier, 1, &barrier);
|
ID3D12GraphicsCommandList2_ResourceBarrier(data->commandList, 1, &barrier);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -525,8 +525,8 @@ static void D3D12_ResetCommandList(D3D12_RenderData *data)
|
|||||||
ID3D12DescriptorHeap *rootDescriptorHeaps[] = { data->srvDescriptorHeap, data->samplerDescriptorHeap };
|
ID3D12DescriptorHeap *rootDescriptorHeaps[] = { data->srvDescriptorHeap, data->samplerDescriptorHeap };
|
||||||
ID3D12CommandAllocator *commandAllocator = data->commandAllocators[data->currentBackBufferIndex];
|
ID3D12CommandAllocator *commandAllocator = data->commandAllocators[data->currentBackBufferIndex];
|
||||||
|
|
||||||
D3D_CALL(commandAllocator, Reset);
|
ID3D12CommandAllocator_Reset(commandAllocator);
|
||||||
D3D_CALL(data->commandList, Reset, commandAllocator, NULL);
|
ID3D12GraphicsCommandList2_Reset(data->commandList, commandAllocator, NULL);
|
||||||
data->currentPipelineState = NULL;
|
data->currentPipelineState = NULL;
|
||||||
data->currentVertexBuffer = 0;
|
data->currentVertexBuffer = 0;
|
||||||
data->issueBatch = SDL_FALSE;
|
data->issueBatch = SDL_FALSE;
|
||||||
@@ -541,7 +541,7 @@ static void D3D12_ResetCommandList(D3D12_RenderData *data)
|
|||||||
}
|
}
|
||||||
data->currentUploadBuffer = 0;
|
data->currentUploadBuffer = 0;
|
||||||
|
|
||||||
D3D_CALL(data->commandList, SetDescriptorHeaps, 2, rootDescriptorHeaps);
|
ID3D12GraphicsCommandList2_SetDescriptorHeaps(data->commandList, 2, rootDescriptorHeaps);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int D3D12_IssueBatch(D3D12_RenderData *data)
|
static int D3D12_IssueBatch(D3D12_RenderData *data)
|
||||||
@@ -549,12 +549,12 @@ static int D3D12_IssueBatch(D3D12_RenderData *data)
|
|||||||
HRESULT result = S_OK;
|
HRESULT result = S_OK;
|
||||||
|
|
||||||
/* Issue the command list */
|
/* Issue the command list */
|
||||||
result = D3D_CALL(data->commandList, Close);
|
result = ID3D12GraphicsCommandList2_Close(data->commandList);
|
||||||
if (FAILED(result)) {
|
if (FAILED(result)) {
|
||||||
WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("D3D12_IssueBatch"), result);
|
WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("D3D12_IssueBatch"), result);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
D3D_CALL(data->commandQueue, ExecuteCommandLists, 1, (ID3D12CommandList *const *)&data->commandList);
|
ID3D12CommandQueue_ExecuteCommandLists(data->commandQueue, 1, (ID3D12CommandList *const *)&data->commandList);
|
||||||
|
|
||||||
D3D12_WaitForGPU(data);
|
D3D12_WaitForGPU(data);
|
||||||
|
|
||||||
@@ -685,7 +685,7 @@ static D3D12_PipelineState *D3D12_CreatePipelineState(SDL_Renderer *renderer,
|
|||||||
pipelineDesc.SampleDesc.Count = 1;
|
pipelineDesc.SampleDesc.Count = 1;
|
||||||
pipelineDesc.SampleDesc.Quality = 0;
|
pipelineDesc.SampleDesc.Quality = 0;
|
||||||
|
|
||||||
result = D3D_CALL(data->d3dDevice, CreateGraphicsPipelineState,
|
result = ID3D12Device1_CreateGraphicsPipelineState(data->d3dDevice,
|
||||||
&pipelineDesc,
|
&pipelineDesc,
|
||||||
D3D_GUID(SDL_IID_ID3D12PipelineState),
|
D3D_GUID(SDL_IID_ID3D12PipelineState),
|
||||||
(void **)&pipelineState);
|
(void **)&pipelineState);
|
||||||
@@ -737,7 +737,7 @@ static HRESULT D3D12_CreateVertexBuffer(D3D12_RenderData *data, size_t vbidx, si
|
|||||||
vbufferDesc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR;
|
vbufferDesc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR;
|
||||||
vbufferDesc.Flags = D3D12_RESOURCE_FLAG_NONE;
|
vbufferDesc.Flags = D3D12_RESOURCE_FLAG_NONE;
|
||||||
|
|
||||||
result = D3D_CALL(data->d3dDevice, CreateCommittedResource,
|
result = ID3D12Device1_CreateCommittedResource(data->d3dDevice,
|
||||||
&vbufferHeapProps,
|
&vbufferHeapProps,
|
||||||
D3D12_HEAP_FLAG_NONE,
|
D3D12_HEAP_FLAG_NONE,
|
||||||
&vbufferDesc,
|
&vbufferDesc,
|
||||||
@@ -751,7 +751,7 @@ static HRESULT D3D12_CreateVertexBuffer(D3D12_RenderData *data, size_t vbidx, si
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
data->vertexBuffers[vbidx].view.BufferLocation = D3D_CALL(data->vertexBuffers[vbidx].resource, GetGPUVirtualAddress);
|
data->vertexBuffers[vbidx].view.BufferLocation = ID3D12Resource_GetGPUVirtualAddress(data->vertexBuffers[vbidx].resource);
|
||||||
data->vertexBuffers[vbidx].view.StrideInBytes = sizeof(VertexPositionColor);
|
data->vertexBuffers[vbidx].view.StrideInBytes = sizeof(VertexPositionColor);
|
||||||
data->vertexBuffers[vbidx].size = size;
|
data->vertexBuffers[vbidx].size = size;
|
||||||
|
|
||||||
@@ -835,7 +835,7 @@ static HRESULT D3D12_CreateDeviceResources(SDL_Renderer *renderer)
|
|||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
if (SUCCEEDED(D3D12GetDebugInterfaceFunc(D3D_GUID(SDL_IID_ID3D12Debug), (void **)&data->debugInterface))) {
|
if (SUCCEEDED(D3D12GetDebugInterfaceFunc(D3D_GUID(SDL_IID_ID3D12Debug), (void **)&data->debugInterface))) {
|
||||||
D3D_CALL(data->debugInterface, EnableDebugLayer);
|
ID3D12Debug_EnableDebugLayer(data->debugInterface);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /*!defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES)*/
|
#endif /*!defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES)*/
|
||||||
@@ -871,8 +871,8 @@ static HRESULT D3D12_CreateDeviceResources(SDL_Renderer *renderer)
|
|||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
D3D_CALL(dxgiInfoQueue, SetBreakOnSeverity, SDL_DXGI_DEBUG_ALL, DXGI_INFO_QUEUE_MESSAGE_SEVERITY_ERROR, TRUE);
|
IDXGIInfoQueue_SetBreakOnSeverity(dxgiInfoQueue, SDL_DXGI_DEBUG_ALL, DXGI_INFO_QUEUE_MESSAGE_SEVERITY_ERROR, TRUE);
|
||||||
D3D_CALL(dxgiInfoQueue, SetBreakOnSeverity, SDL_DXGI_DEBUG_ALL, DXGI_INFO_QUEUE_MESSAGE_SEVERITY_CORRUPTION, TRUE);
|
IDXGIInfoQueue_SetBreakOnSeverity(dxgiInfoQueue, SDL_DXGI_DEBUG_ALL, DXGI_INFO_QUEUE_MESSAGE_SEVERITY_CORRUPTION, TRUE);
|
||||||
D3D_SAFE_RELEASE(dxgiInfoQueue);
|
D3D_SAFE_RELEASE(dxgiInfoQueue);
|
||||||
#endif /* __IDXGIInfoQueue_INTERFACE_DEFINED__ */
|
#endif /* __IDXGIInfoQueue_INTERFACE_DEFINED__ */
|
||||||
creationFlags = DXGI_CREATE_FACTORY_DEBUG;
|
creationFlags = DXGI_CREATE_FACTORY_DEBUG;
|
||||||
@@ -885,7 +885,7 @@ static HRESULT D3D12_CreateDeviceResources(SDL_Renderer *renderer)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Prefer a high performance adapter if there are multiple choices */
|
/* Prefer a high performance adapter if there are multiple choices */
|
||||||
result = D3D_CALL(data->dxgiFactory, EnumAdapterByGpuPreference,
|
result = IDXGIFactory6_EnumAdapterByGpuPreference(data->dxgiFactory,
|
||||||
0,
|
0,
|
||||||
DXGI_GPU_PREFERENCE_HIGH_PERFORMANCE,
|
DXGI_GPU_PREFERENCE_HIGH_PERFORMANCE,
|
||||||
D3D_GUID(SDL_IID_IDXGIAdapter4),
|
D3D_GUID(SDL_IID_IDXGIAdapter4),
|
||||||
@@ -910,7 +910,7 @@ static HRESULT D3D12_CreateDeviceResources(SDL_Renderer *renderer)
|
|||||||
D3D12_MESSAGE_SEVERITY severities[] = { D3D12_MESSAGE_SEVERITY_INFO };
|
D3D12_MESSAGE_SEVERITY severities[] = { D3D12_MESSAGE_SEVERITY_INFO };
|
||||||
D3D12_INFO_QUEUE_FILTER filter;
|
D3D12_INFO_QUEUE_FILTER filter;
|
||||||
|
|
||||||
result = D3D_CALL(d3dDevice, QueryInterface, D3D_GUID(SDL_IID_ID3D12InfoQueue), (void **)&infoQueue);
|
result = ID3D12Device1_QueryInterface(d3dDevice, D3D_GUID(SDL_IID_ID3D12InfoQueue), (void **)&infoQueue);
|
||||||
if (FAILED(result)) {
|
if (FAILED(result)) {
|
||||||
WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D12Device to ID3D12InfoQueue"), result);
|
WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D12Device to ID3D12InfoQueue"), result);
|
||||||
goto done;
|
goto done;
|
||||||
@@ -919,16 +919,16 @@ static HRESULT D3D12_CreateDeviceResources(SDL_Renderer *renderer)
|
|||||||
SDL_zero(filter);
|
SDL_zero(filter);
|
||||||
filter.DenyList.NumSeverities = 1;
|
filter.DenyList.NumSeverities = 1;
|
||||||
filter.DenyList.pSeverityList = severities;
|
filter.DenyList.pSeverityList = severities;
|
||||||
D3D_CALL(infoQueue, PushStorageFilter, &filter);
|
ID3D12InfoQueue_PushStorageFilter(infoQueue, &filter);
|
||||||
|
|
||||||
D3D_CALL(infoQueue, SetBreakOnSeverity, D3D12_MESSAGE_SEVERITY_ERROR, TRUE);
|
ID3D12InfoQueue_SetBreakOnSeverity(infoQueue, D3D12_MESSAGE_SEVERITY_ERROR, TRUE);
|
||||||
D3D_CALL(infoQueue, SetBreakOnSeverity, D3D12_MESSAGE_SEVERITY_CORRUPTION, TRUE);
|
ID3D12InfoQueue_SetBreakOnSeverity(infoQueue, D3D12_MESSAGE_SEVERITY_CORRUPTION, TRUE);
|
||||||
|
|
||||||
D3D_SAFE_RELEASE(infoQueue);
|
D3D_SAFE_RELEASE(infoQueue);
|
||||||
}
|
}
|
||||||
#endif /*!defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES)*/
|
#endif /*!defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES)*/
|
||||||
|
|
||||||
result = D3D_CALL(d3dDevice, QueryInterface, D3D_GUID(SDL_IID_ID3D12Device1), (void **)&data->d3dDevice);
|
result = ID3D12Device_QueryInterface(d3dDevice, D3D_GUID(SDL_IID_ID3D12Device1), (void **)&data->d3dDevice);
|
||||||
if (FAILED(result)) {
|
if (FAILED(result)) {
|
||||||
WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D12Device to ID3D12Device1"), result);
|
WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D12Device to ID3D12Device1"), result);
|
||||||
goto done;
|
goto done;
|
||||||
@@ -939,7 +939,7 @@ static HRESULT D3D12_CreateDeviceResources(SDL_Renderer *renderer)
|
|||||||
queueDesc.Flags = D3D12_COMMAND_QUEUE_FLAG_NONE;
|
queueDesc.Flags = D3D12_COMMAND_QUEUE_FLAG_NONE;
|
||||||
queueDesc.Type = D3D12_COMMAND_LIST_TYPE_DIRECT;
|
queueDesc.Type = D3D12_COMMAND_LIST_TYPE_DIRECT;
|
||||||
|
|
||||||
result = D3D_CALL(data->d3dDevice, CreateCommandQueue,
|
result = ID3D12Device1_CreateCommandQueue(data->d3dDevice,
|
||||||
&queueDesc,
|
&queueDesc,
|
||||||
D3D_GUID(SDL_IID_ID3D12CommandQueue),
|
D3D_GUID(SDL_IID_ID3D12CommandQueue),
|
||||||
(void **)&data->commandQueue);
|
(void **)&data->commandQueue);
|
||||||
@@ -952,7 +952,7 @@ static HRESULT D3D12_CreateDeviceResources(SDL_Renderer *renderer)
|
|||||||
SDL_zero(descriptorHeapDesc);
|
SDL_zero(descriptorHeapDesc);
|
||||||
descriptorHeapDesc.NumDescriptors = SDL_D3D12_NUM_BUFFERS;
|
descriptorHeapDesc.NumDescriptors = SDL_D3D12_NUM_BUFFERS;
|
||||||
descriptorHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV;
|
descriptorHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV;
|
||||||
result = D3D_CALL(data->d3dDevice, CreateDescriptorHeap,
|
result = ID3D12Device1_CreateDescriptorHeap(data->d3dDevice,
|
||||||
&descriptorHeapDesc,
|
&descriptorHeapDesc,
|
||||||
D3D_GUID(SDL_IID_ID3D12DescriptorHeap),
|
D3D_GUID(SDL_IID_ID3D12DescriptorHeap),
|
||||||
(void **)&data->rtvDescriptorHeap);
|
(void **)&data->rtvDescriptorHeap);
|
||||||
@@ -960,10 +960,10 @@ static HRESULT D3D12_CreateDeviceResources(SDL_Renderer *renderer)
|
|||||||
WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D12Device::CreateDescriptorHeap [rtv]"), result);
|
WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D12Device::CreateDescriptorHeap [rtv]"), result);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
data->rtvDescriptorSize = D3D_CALL(d3dDevice, GetDescriptorHandleIncrementSize, D3D12_DESCRIPTOR_HEAP_TYPE_RTV);
|
data->rtvDescriptorSize = ID3D12Device1_GetDescriptorHandleIncrementSize(d3dDevice, D3D12_DESCRIPTOR_HEAP_TYPE_RTV);
|
||||||
|
|
||||||
descriptorHeapDesc.NumDescriptors = SDL_D3D12_MAX_NUM_TEXTURES;
|
descriptorHeapDesc.NumDescriptors = SDL_D3D12_MAX_NUM_TEXTURES;
|
||||||
result = D3D_CALL(data->d3dDevice, CreateDescriptorHeap,
|
result = ID3D12Device1_CreateDescriptorHeap(data->d3dDevice,
|
||||||
&descriptorHeapDesc,
|
&descriptorHeapDesc,
|
||||||
D3D_GUID(SDL_IID_ID3D12DescriptorHeap),
|
D3D_GUID(SDL_IID_ID3D12DescriptorHeap),
|
||||||
(void **)&data->textureRTVDescriptorHeap);
|
(void **)&data->textureRTVDescriptorHeap);
|
||||||
@@ -976,7 +976,7 @@ static HRESULT D3D12_CreateDeviceResources(SDL_Renderer *renderer)
|
|||||||
descriptorHeapDesc.NumDescriptors = SDL_D3D12_MAX_NUM_TEXTURES;
|
descriptorHeapDesc.NumDescriptors = SDL_D3D12_MAX_NUM_TEXTURES;
|
||||||
descriptorHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;
|
descriptorHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;
|
||||||
descriptorHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;
|
descriptorHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;
|
||||||
result = D3D_CALL(data->d3dDevice, CreateDescriptorHeap,
|
result = ID3D12Device1_CreateDescriptorHeap(data->d3dDevice,
|
||||||
&descriptorHeapDesc,
|
&descriptorHeapDesc,
|
||||||
D3D_GUID(SDL_IID_ID3D12DescriptorHeap),
|
D3D_GUID(SDL_IID_ID3D12DescriptorHeap),
|
||||||
(void **)&data->srvDescriptorHeap);
|
(void **)&data->srvDescriptorHeap);
|
||||||
@@ -985,13 +985,13 @@ static HRESULT D3D12_CreateDeviceResources(SDL_Renderer *renderer)
|
|||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
rootDescriptorHeaps[0] = data->srvDescriptorHeap;
|
rootDescriptorHeaps[0] = data->srvDescriptorHeap;
|
||||||
data->srvDescriptorSize = D3D_CALL(d3dDevice, GetDescriptorHandleIncrementSize, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
|
data->srvDescriptorSize = ID3D12Device1_GetDescriptorHandleIncrementSize(d3dDevice, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
|
||||||
|
|
||||||
SDL_zero(descriptorHeapDesc);
|
SDL_zero(descriptorHeapDesc);
|
||||||
descriptorHeapDesc.NumDescriptors = 4;
|
descriptorHeapDesc.NumDescriptors = 4;
|
||||||
descriptorHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER;
|
descriptorHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER;
|
||||||
descriptorHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;
|
descriptorHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;
|
||||||
result = D3D_CALL(data->d3dDevice, CreateDescriptorHeap,
|
result = ID3D12Device1_CreateDescriptorHeap(data->d3dDevice,
|
||||||
&descriptorHeapDesc,
|
&descriptorHeapDesc,
|
||||||
D3D_GUID(SDL_IID_ID3D12DescriptorHeap),
|
D3D_GUID(SDL_IID_ID3D12DescriptorHeap),
|
||||||
(void **)&data->samplerDescriptorHeap);
|
(void **)&data->samplerDescriptorHeap);
|
||||||
@@ -1000,11 +1000,11 @@ static HRESULT D3D12_CreateDeviceResources(SDL_Renderer *renderer)
|
|||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
rootDescriptorHeaps[1] = data->samplerDescriptorHeap;
|
rootDescriptorHeaps[1] = data->samplerDescriptorHeap;
|
||||||
data->samplerDescriptorSize = D3D_CALL(d3dDevice, GetDescriptorHandleIncrementSize, D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER);
|
data->samplerDescriptorSize = ID3D12Device1_GetDescriptorHandleIncrementSize(d3dDevice, D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER);
|
||||||
|
|
||||||
/* Create a command allocator for each back buffer */
|
/* Create a command allocator for each back buffer */
|
||||||
for (i = 0; i < SDL_D3D12_NUM_BUFFERS; ++i) {
|
for (i = 0; i < SDL_D3D12_NUM_BUFFERS; ++i) {
|
||||||
result = D3D_CALL(data->d3dDevice, CreateCommandAllocator,
|
result = ID3D12Device1_CreateCommandAllocator(data->d3dDevice,
|
||||||
D3D12_COMMAND_LIST_TYPE_DIRECT,
|
D3D12_COMMAND_LIST_TYPE_DIRECT,
|
||||||
D3D_GUID(SDL_IID_ID3D12CommandAllocator),
|
D3D_GUID(SDL_IID_ID3D12CommandAllocator),
|
||||||
(void **)&data->commandAllocators[i]);
|
(void **)&data->commandAllocators[i]);
|
||||||
@@ -1015,7 +1015,7 @@ static HRESULT D3D12_CreateDeviceResources(SDL_Renderer *renderer)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Create the command list */
|
/* Create the command list */
|
||||||
result = D3D_CALL(data->d3dDevice, CreateCommandList,
|
result = ID3D12Device1_CreateCommandList(data->d3dDevice,
|
||||||
0,
|
0,
|
||||||
D3D12_COMMAND_LIST_TYPE_DIRECT,
|
D3D12_COMMAND_LIST_TYPE_DIRECT,
|
||||||
data->commandAllocators[0],
|
data->commandAllocators[0],
|
||||||
@@ -1028,10 +1028,10 @@ static HRESULT D3D12_CreateDeviceResources(SDL_Renderer *renderer)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Set the descriptor heaps to the correct initial value */
|
/* Set the descriptor heaps to the correct initial value */
|
||||||
D3D_CALL(data->commandList, SetDescriptorHeaps, 2, rootDescriptorHeaps);
|
ID3D12GraphicsCommandList2_SetDescriptorHeaps(data->commandList, 2, rootDescriptorHeaps);
|
||||||
|
|
||||||
/* Create the fence and fence event */
|
/* Create the fence and fence event */
|
||||||
result = D3D_CALL(data->d3dDevice, CreateFence,
|
result = ID3D12Device_CreateFence(data->d3dDevice,
|
||||||
data->fenceValue,
|
data->fenceValue,
|
||||||
D3D12_FENCE_FLAG_NONE,
|
D3D12_FENCE_FLAG_NONE,
|
||||||
D3D_GUID(SDL_IID_ID3D12Fence),
|
D3D_GUID(SDL_IID_ID3D12Fence),
|
||||||
@@ -1053,7 +1053,7 @@ static HRESULT D3D12_CreateDeviceResources(SDL_Renderer *renderer)
|
|||||||
for (i = 0; i < NUM_ROOTSIGS; ++i) {
|
for (i = 0; i < NUM_ROOTSIGS; ++i) {
|
||||||
D3D12_SHADER_BYTECODE rootSigData;
|
D3D12_SHADER_BYTECODE rootSigData;
|
||||||
D3D12_GetRootSignatureData((D3D12_RootSignature)i, &rootSigData);
|
D3D12_GetRootSignatureData((D3D12_RootSignature)i, &rootSigData);
|
||||||
result = D3D_CALL(data->d3dDevice, CreateRootSignature,
|
result = ID3D12Device1_CreateRootSignature(data->d3dDevice,
|
||||||
0,
|
0,
|
||||||
rootSigData.pShaderBytecode,
|
rootSigData.pShaderBytecode,
|
||||||
rootSigData.BytecodeLength,
|
rootSigData.BytecodeLength,
|
||||||
@@ -1120,7 +1120,7 @@ static HRESULT D3D12_CreateDeviceResources(SDL_Renderer *renderer)
|
|||||||
samplerDesc.AddressU = samplerParams[i].address;
|
samplerDesc.AddressU = samplerParams[i].address;
|
||||||
samplerDesc.AddressV = samplerParams[i].address;
|
samplerDesc.AddressV = samplerParams[i].address;
|
||||||
data->samplers[i].ptr = data->samplers[0].ptr + i * data->samplerDescriptorSize;
|
data->samplers[i].ptr = data->samplers[0].ptr + i * data->samplerDescriptorSize;
|
||||||
D3D_CALL(data->d3dDevice, CreateSampler, &samplerDesc, data->samplers[i]);
|
ID3D12Device1_CreateSampler(data->d3dDevice, &samplerDesc, data->samplers[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize the pool allocator for SRVs */
|
/* Initialize the pool allocator for SRVs */
|
||||||
@@ -1258,7 +1258,7 @@ static HRESULT D3D12_CreateSwapChain(SDL_Renderer *renderer, int w, int h)
|
|||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
result = D3D_CALL(data->dxgiFactory, CreateSwapChainForHwnd,
|
result = IDXGIFactory2_CreateSwapChainForHwnd(data->dxgiFactory,
|
||||||
(IUnknown *)data->commandQueue,
|
(IUnknown *)data->commandQueue,
|
||||||
hwnd,
|
hwnd,
|
||||||
&swapChainDesc,
|
&swapChainDesc,
|
||||||
@@ -1270,9 +1270,9 @@ static HRESULT D3D12_CreateSwapChain(SDL_Renderer *renderer, int w, int h)
|
|||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
D3D_CALL(data->dxgiFactory, MakeWindowAssociation, hwnd, DXGI_MWA_NO_WINDOW_CHANGES);
|
IDXGIFactory6_MakeWindowAssociation(data->dxgiFactory, hwnd, DXGI_MWA_NO_WINDOW_CHANGES);
|
||||||
|
|
||||||
result = D3D_CALL(swapChain, QueryInterface, D3D_GUID(SDL_IID_IDXGISwapChain4), (void **)&data->swapChain);
|
result = IDXGISwapChain1_QueryInterface(swapChain, D3D_GUID(SDL_IID_IDXGISwapChain4), (void **)&data->swapChain);
|
||||||
if (FAILED(result)) {
|
if (FAILED(result)) {
|
||||||
WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("IDXGISwapChain1::QueryInterface"), result);
|
WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("IDXGISwapChain1::QueryInterface"), result);
|
||||||
goto done;
|
goto done;
|
||||||
@@ -1281,7 +1281,7 @@ static HRESULT D3D12_CreateSwapChain(SDL_Renderer *renderer, int w, int h)
|
|||||||
/* Ensure that the swapchain does not queue more than one frame at a time. This both reduces latency
|
/* Ensure that the swapchain does not queue more than one frame at a time. This both reduces latency
|
||||||
* and ensures that the application will only render after each VSync, minimizing power consumption.
|
* and ensures that the application will only render after each VSync, minimizing power consumption.
|
||||||
*/
|
*/
|
||||||
result = D3D_CALL(data->swapChain, SetMaximumFrameLatency, 1);
|
result = IDXGISwapChain4_SetMaximumFrameLatency(data->swapChain, 1);
|
||||||
if (FAILED(result)) {
|
if (FAILED(result)) {
|
||||||
WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("IDXGISwapChain4::SetMaximumFrameLatency"), result);
|
WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("IDXGISwapChain4::SetMaximumFrameLatency"), result);
|
||||||
goto done;
|
goto done;
|
||||||
@@ -1304,9 +1304,9 @@ static HRESULT D3D12_CreateSwapChain(SDL_Renderer *renderer, int w, int h)
|
|||||||
colorspace = DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709;
|
colorspace = DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (SUCCEEDED(D3D_CALL(data->swapChain, CheckColorSpaceSupport, colorspace, &colorspace_support)) &&
|
if (SUCCEEDED(IDXGISwapChain3_CheckColorSpaceSupport(data->swapChain, colorspace, &colorspace_support)) &&
|
||||||
(colorspace_support & DXGI_SWAP_CHAIN_COLOR_SPACE_SUPPORT_FLAG_PRESENT)) {
|
(colorspace_support & DXGI_SWAP_CHAIN_COLOR_SPACE_SUPPORT_FLAG_PRESENT)) {
|
||||||
result = D3D_CALL(data->swapChain, SetColorSpace1, colorspace);
|
result = IDXGISwapChain3_SetColorSpace1(data->swapChain, colorspace);
|
||||||
if (FAILED(result)) {
|
if (FAILED(result)) {
|
||||||
WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("IDXGISwapChain3::SetColorSpace1"), result);
|
WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("IDXGISwapChain3::SetColorSpace1"), result);
|
||||||
goto done;
|
goto done;
|
||||||
@@ -1369,7 +1369,7 @@ static HRESULT D3D12_CreateWindowSizeDependentResources(SDL_Renderer *renderer)
|
|||||||
|
|
||||||
/* Release resources in the current command list */
|
/* Release resources in the current command list */
|
||||||
D3D12_IssueBatch(data);
|
D3D12_IssueBatch(data);
|
||||||
D3D_CALL(data->commandList, OMSetRenderTargets, 0, NULL, FALSE, NULL);
|
ID3D12GraphicsCommandList2_OMSetRenderTargets(data->commandList, 0, NULL, FALSE, NULL);
|
||||||
|
|
||||||
/* Release render targets */
|
/* Release render targets */
|
||||||
for (i = 0; i < SDL_D3D12_NUM_BUFFERS; ++i) {
|
for (i = 0; i < SDL_D3D12_NUM_BUFFERS; ++i) {
|
||||||
@@ -1390,7 +1390,7 @@ static HRESULT D3D12_CreateWindowSizeDependentResources(SDL_Renderer *renderer)
|
|||||||
#if !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES)
|
#if !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES)
|
||||||
if (data->swapChain) {
|
if (data->swapChain) {
|
||||||
/* If the swap chain already exists, resize it. */
|
/* If the swap chain already exists, resize it. */
|
||||||
result = D3D_CALL(data->swapChain, ResizeBuffers,
|
result = IDXGISwapChain_ResizeBuffers(data->swapChain,
|
||||||
0,
|
0,
|
||||||
w, h,
|
w, h,
|
||||||
DXGI_FORMAT_UNKNOWN,
|
DXGI_FORMAT_UNKNOWN,
|
||||||
@@ -1417,7 +1417,7 @@ static HRESULT D3D12_CreateWindowSizeDependentResources(SDL_Renderer *renderer)
|
|||||||
/* Set the proper rotation for the swap chain. */
|
/* Set the proper rotation for the swap chain. */
|
||||||
if (WIN_IsWindows8OrGreater()) {
|
if (WIN_IsWindows8OrGreater()) {
|
||||||
if (data->swapEffect == DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL) {
|
if (data->swapEffect == DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL) {
|
||||||
result = D3D_CALL(data->swapChain, SetRotation, data->rotation); /* NOLINT(clang-analyzer-core.NullDereference) */
|
result = IDXGISwapChain4_SetRotation(data->swapChain, data->rotation); /* NOLINT(clang-analyzer-core.NullDereference) */
|
||||||
if (FAILED(result)) {
|
if (FAILED(result)) {
|
||||||
WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("IDXGISwapChain4::SetRotation"), result);
|
WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("IDXGISwapChain4::SetRotation"), result);
|
||||||
goto done;
|
goto done;
|
||||||
@@ -1435,7 +1435,7 @@ static HRESULT D3D12_CreateWindowSizeDependentResources(SDL_Renderer *renderer)
|
|||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
result = D3D_CALL(data->swapChain, GetBuffer, /* NOLINT(clang-analyzer-core.NullDereference) */
|
result = IDXGISwapChain4_GetBuffer(data->swapChain, /* NOLINT(clang-analyzer-core.NullDereference) */
|
||||||
i,
|
i,
|
||||||
D3D_GUID(SDL_IID_ID3D12Resource),
|
D3D_GUID(SDL_IID_ID3D12Resource),
|
||||||
(void **)&data->renderTargets[i]);
|
(void **)&data->renderTargets[i]);
|
||||||
@@ -1452,14 +1452,14 @@ static HRESULT D3D12_CreateWindowSizeDependentResources(SDL_Renderer *renderer)
|
|||||||
SDL_zero(rtvDescriptor);
|
SDL_zero(rtvDescriptor);
|
||||||
D3D_CALL_RET(data->rtvDescriptorHeap, GetCPUDescriptorHandleForHeapStart, &rtvDescriptor);
|
D3D_CALL_RET(data->rtvDescriptorHeap, GetCPUDescriptorHandleForHeapStart, &rtvDescriptor);
|
||||||
rtvDescriptor.ptr += i * data->rtvDescriptorSize;
|
rtvDescriptor.ptr += i * data->rtvDescriptorSize;
|
||||||
D3D_CALL(data->d3dDevice, CreateRenderTargetView, data->renderTargets[i], &rtvDesc, rtvDescriptor);
|
ID3D12Device1_CreateRenderTargetView(data->d3dDevice, data->renderTargets[i], &rtvDesc, rtvDescriptor);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set back buffer index to current buffer */
|
/* Set back buffer index to current buffer */
|
||||||
#if defined(SDL_PLATFORM_XBOXONE) || defined(SDL_PLATFORM_XBOXSERIES)
|
#if defined(SDL_PLATFORM_XBOXONE) || defined(SDL_PLATFORM_XBOXSERIES)
|
||||||
data->currentBackBufferIndex = 0;
|
data->currentBackBufferIndex = 0;
|
||||||
#else
|
#else
|
||||||
data->currentBackBufferIndex = D3D_CALL(data->swapChain, GetCurrentBackBufferIndex);
|
data->currentBackBufferIndex = IDXGISwapChain4_GetCurrentBackBufferIndex(data->swapChain);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Set the swap chain target immediately, so that a target is always set
|
/* Set the swap chain target immediately, so that a target is always set
|
||||||
@@ -1467,7 +1467,7 @@ static HRESULT D3D12_CreateWindowSizeDependentResources(SDL_Renderer *renderer)
|
|||||||
* null references in places like ReadPixels!
|
* null references in places like ReadPixels!
|
||||||
*/
|
*/
|
||||||
data->currentRenderTargetView = D3D12_GetCurrentRenderTargetView(renderer);
|
data->currentRenderTargetView = D3D12_GetCurrentRenderTargetView(renderer);
|
||||||
D3D_CALL(data->commandList, OMSetRenderTargets, 1, &data->currentRenderTargetView, FALSE, NULL);
|
ID3D12GraphicsCommandList2_OMSetRenderTargets(data->commandList, 1, &data->currentRenderTargetView, FALSE, NULL);
|
||||||
D3D12_TransitionResource(data,
|
D3D12_TransitionResource(data,
|
||||||
data->renderTargets[data->currentBackBufferIndex],
|
data->renderTargets[data->currentBackBufferIndex],
|
||||||
D3D12_RESOURCE_STATE_PRESENT,
|
D3D12_RESOURCE_STATE_PRESENT,
|
||||||
@@ -1543,7 +1543,11 @@ static int GetTextureProperty(SDL_PropertiesID props, const char *name, ID3D12Re
|
|||||||
{
|
{
|
||||||
IUnknown *unknown = (IUnknown*)SDL_GetPointerProperty(props, name, NULL);
|
IUnknown *unknown = (IUnknown*)SDL_GetPointerProperty(props, name, NULL);
|
||||||
if (unknown) {
|
if (unknown) {
|
||||||
HRESULT result = D3D_CALL(unknown, QueryInterface, D3D_GUID(SDL_IID_ID3D12Resource), (void **)texture);
|
#if defined(SDL_PLATFORM_XBOXONE) || defined(SDL_PLATFORM_XBOXSERIES)
|
||||||
|
HRESULT result = unknown->QueryInterface(D3D_GUID(SDL_IID_ID3D12Resource), (void **)texture);
|
||||||
|
#else
|
||||||
|
HRESULT result = IUnknown_QueryInterface(unknown, D3D_GUID(SDL_IID_ID3D12Resource), (void **)texture);
|
||||||
|
#endif
|
||||||
if (FAILED(result)) {
|
if (FAILED(result)) {
|
||||||
return WIN_SetErrorFromHRESULT(name, result);
|
return WIN_SetErrorFromHRESULT(name, result);
|
||||||
}
|
}
|
||||||
@@ -1613,7 +1617,7 @@ static int D3D12_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (!textureData->mainTexture) {
|
if (!textureData->mainTexture) {
|
||||||
result = D3D_CALL(rendererData->d3dDevice, CreateCommittedResource,
|
result = ID3D12Device1_CreateCommittedResource(rendererData->d3dDevice,
|
||||||
&heapProps,
|
&heapProps,
|
||||||
D3D12_HEAP_FLAG_NONE,
|
D3D12_HEAP_FLAG_NONE,
|
||||||
&textureDesc,
|
&textureDesc,
|
||||||
@@ -1639,7 +1643,7 @@ static int D3D12_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (!textureData->mainTextureU) {
|
if (!textureData->mainTextureU) {
|
||||||
result = D3D_CALL(rendererData->d3dDevice, CreateCommittedResource,
|
result = ID3D12Device1_CreateCommittedResource(rendererData->d3dDevice,
|
||||||
&heapProps,
|
&heapProps,
|
||||||
D3D12_HEAP_FLAG_NONE,
|
D3D12_HEAP_FLAG_NONE,
|
||||||
&textureDesc,
|
&textureDesc,
|
||||||
@@ -1658,7 +1662,7 @@ static int D3D12_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (!textureData->mainTextureV) {
|
if (!textureData->mainTextureV) {
|
||||||
result = D3D_CALL(rendererData->d3dDevice, CreateCommittedResource,
|
result = ID3D12Device1_CreateCommittedResource(rendererData->d3dDevice,
|
||||||
&heapProps,
|
&heapProps,
|
||||||
D3D12_HEAP_FLAG_NONE,
|
D3D12_HEAP_FLAG_NONE,
|
||||||
&textureDesc,
|
&textureDesc,
|
||||||
@@ -1710,7 +1714,7 @@ static int D3D12_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL
|
|||||||
D3D_CALL_RET(rendererData->srvDescriptorHeap, GetCPUDescriptorHandleForHeapStart, &textureData->mainTextureResourceView);
|
D3D_CALL_RET(rendererData->srvDescriptorHeap, GetCPUDescriptorHandleForHeapStart, &textureData->mainTextureResourceView);
|
||||||
textureData->mainTextureResourceView.ptr += textureData->mainSRVIndex * rendererData->srvDescriptorSize;
|
textureData->mainTextureResourceView.ptr += textureData->mainSRVIndex * rendererData->srvDescriptorSize;
|
||||||
|
|
||||||
D3D_CALL(rendererData->d3dDevice, CreateShaderResourceView,
|
ID3D12Device1_CreateShaderResourceView(rendererData->d3dDevice,
|
||||||
textureData->mainTexture,
|
textureData->mainTexture,
|
||||||
&resourceViewDesc,
|
&resourceViewDesc,
|
||||||
textureData->mainTextureResourceView);
|
textureData->mainTextureResourceView);
|
||||||
@@ -1719,7 +1723,7 @@ static int D3D12_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL
|
|||||||
D3D_CALL_RET(rendererData->srvDescriptorHeap, GetCPUDescriptorHandleForHeapStart, &textureData->mainTextureResourceViewU);
|
D3D_CALL_RET(rendererData->srvDescriptorHeap, GetCPUDescriptorHandleForHeapStart, &textureData->mainTextureResourceViewU);
|
||||||
textureData->mainSRVIndexU = D3D12_GetAvailableSRVIndex(renderer);
|
textureData->mainSRVIndexU = D3D12_GetAvailableSRVIndex(renderer);
|
||||||
textureData->mainTextureResourceViewU.ptr += textureData->mainSRVIndexU * rendererData->srvDescriptorSize;
|
textureData->mainTextureResourceViewU.ptr += textureData->mainSRVIndexU * rendererData->srvDescriptorSize;
|
||||||
D3D_CALL(rendererData->d3dDevice, CreateShaderResourceView,
|
ID3D12Device1_CreateShaderResourceView(rendererData->d3dDevice,
|
||||||
textureData->mainTextureU,
|
textureData->mainTextureU,
|
||||||
&resourceViewDesc,
|
&resourceViewDesc,
|
||||||
textureData->mainTextureResourceViewU);
|
textureData->mainTextureResourceViewU);
|
||||||
@@ -1727,7 +1731,7 @@ static int D3D12_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL
|
|||||||
D3D_CALL_RET(rendererData->srvDescriptorHeap, GetCPUDescriptorHandleForHeapStart, &textureData->mainTextureResourceViewV);
|
D3D_CALL_RET(rendererData->srvDescriptorHeap, GetCPUDescriptorHandleForHeapStart, &textureData->mainTextureResourceViewV);
|
||||||
textureData->mainSRVIndexV = D3D12_GetAvailableSRVIndex(renderer);
|
textureData->mainSRVIndexV = D3D12_GetAvailableSRVIndex(renderer);
|
||||||
textureData->mainTextureResourceViewV.ptr += textureData->mainSRVIndexV * rendererData->srvDescriptorSize;
|
textureData->mainTextureResourceViewV.ptr += textureData->mainSRVIndexV * rendererData->srvDescriptorSize;
|
||||||
D3D_CALL(rendererData->d3dDevice, CreateShaderResourceView,
|
ID3D12Device1_CreateShaderResourceView(rendererData->d3dDevice,
|
||||||
textureData->mainTextureV,
|
textureData->mainTextureV,
|
||||||
&resourceViewDesc,
|
&resourceViewDesc,
|
||||||
textureData->mainTextureResourceViewV);
|
textureData->mainTextureResourceViewV);
|
||||||
@@ -1746,7 +1750,7 @@ static int D3D12_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL
|
|||||||
D3D_CALL_RET(rendererData->srvDescriptorHeap, GetCPUDescriptorHandleForHeapStart, &textureData->mainTextureResourceViewNV);
|
D3D_CALL_RET(rendererData->srvDescriptorHeap, GetCPUDescriptorHandleForHeapStart, &textureData->mainTextureResourceViewNV);
|
||||||
textureData->mainSRVIndexNV = D3D12_GetAvailableSRVIndex(renderer);
|
textureData->mainSRVIndexNV = D3D12_GetAvailableSRVIndex(renderer);
|
||||||
textureData->mainTextureResourceViewNV.ptr += textureData->mainSRVIndexNV * rendererData->srvDescriptorSize;
|
textureData->mainTextureResourceViewNV.ptr += textureData->mainSRVIndexNV * rendererData->srvDescriptorSize;
|
||||||
D3D_CALL(rendererData->d3dDevice, CreateShaderResourceView,
|
ID3D12Device1_CreateShaderResourceView(rendererData->d3dDevice,
|
||||||
textureData->mainTexture,
|
textureData->mainTexture,
|
||||||
&nvResourceViewDesc,
|
&nvResourceViewDesc,
|
||||||
textureData->mainTextureResourceViewNV);
|
textureData->mainTextureResourceViewNV);
|
||||||
@@ -1763,7 +1767,7 @@ static int D3D12_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL
|
|||||||
D3D_CALL_RET(rendererData->textureRTVDescriptorHeap, GetCPUDescriptorHandleForHeapStart, &textureData->mainTextureRenderTargetView);
|
D3D_CALL_RET(rendererData->textureRTVDescriptorHeap, GetCPUDescriptorHandleForHeapStart, &textureData->mainTextureRenderTargetView);
|
||||||
textureData->mainTextureRenderTargetView.ptr += textureData->mainSRVIndex * rendererData->rtvDescriptorSize;
|
textureData->mainTextureRenderTargetView.ptr += textureData->mainSRVIndex * rendererData->rtvDescriptorSize;
|
||||||
|
|
||||||
D3D_CALL(rendererData->d3dDevice, CreateRenderTargetView,
|
ID3D12Device1_CreateRenderTargetView(rendererData->d3dDevice,
|
||||||
(ID3D12Resource *)textureData->mainTexture,
|
(ID3D12Resource *)textureData->mainTexture,
|
||||||
&renderTargetViewDesc,
|
&renderTargetViewDesc,
|
||||||
textureData->mainTextureRenderTargetView);
|
textureData->mainTextureRenderTargetView);
|
||||||
@@ -1846,7 +1850,7 @@ static int D3D12_UpdateTextureInternal(D3D12_RenderData *rendererData, ID3D12Res
|
|||||||
uploadDesc.Flags = D3D12_RESOURCE_FLAG_NONE;
|
uploadDesc.Flags = D3D12_RESOURCE_FLAG_NONE;
|
||||||
|
|
||||||
/* Figure out how much we need to allocate for the upload buffer */
|
/* Figure out how much we need to allocate for the upload buffer */
|
||||||
D3D_CALL(rendererData->d3dDevice, GetCopyableFootprints,
|
ID3D12Device1_GetCopyableFootprints(rendererData->d3dDevice,
|
||||||
&textureDesc,
|
&textureDesc,
|
||||||
plane,
|
plane,
|
||||||
1,
|
1,
|
||||||
@@ -1863,7 +1867,7 @@ static int D3D12_UpdateTextureInternal(D3D12_RenderData *rendererData, ID3D12Res
|
|||||||
heapProps.VisibleNodeMask = 1;
|
heapProps.VisibleNodeMask = 1;
|
||||||
|
|
||||||
/* Create the upload buffer */
|
/* Create the upload buffer */
|
||||||
result = D3D_CALL(rendererData->d3dDevice, CreateCommittedResource,
|
result = ID3D12Device1_CreateCommittedResource(rendererData->d3dDevice,
|
||||||
&heapProps,
|
&heapProps,
|
||||||
D3D12_HEAP_FLAG_NONE,
|
D3D12_HEAP_FLAG_NONE,
|
||||||
&uploadDesc,
|
&uploadDesc,
|
||||||
@@ -1877,7 +1881,7 @@ static int D3D12_UpdateTextureInternal(D3D12_RenderData *rendererData, ID3D12Res
|
|||||||
|
|
||||||
/* Get a write-only pointer to data in the upload buffer: */
|
/* Get a write-only pointer to data in the upload buffer: */
|
||||||
uploadBuffer = rendererData->uploadBuffers[rendererData->currentUploadBuffer];
|
uploadBuffer = rendererData->uploadBuffers[rendererData->currentUploadBuffer];
|
||||||
result = D3D_CALL(uploadBuffer, Map,
|
result = ID3D12Resource_Map(uploadBuffer,
|
||||||
0,
|
0,
|
||||||
NULL,
|
NULL,
|
||||||
(void **)&textureMemory);
|
(void **)&textureMemory);
|
||||||
@@ -1906,7 +1910,7 @@ static int D3D12_UpdateTextureInternal(D3D12_RenderData *rendererData, ID3D12Res
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Commit the changes back to the upload buffer: */
|
/* Commit the changes back to the upload buffer: */
|
||||||
D3D_CALL(uploadBuffer, Unmap, 0, NULL);
|
ID3D12Resource_Unmap(uploadBuffer, 0, NULL);
|
||||||
|
|
||||||
/* Make sure the destination is in the correct resource state */
|
/* Make sure the destination is in the correct resource state */
|
||||||
D3D12_TransitionResource(rendererData, texture, *resourceState, D3D12_RESOURCE_STATE_COPY_DEST);
|
D3D12_TransitionResource(rendererData, texture, *resourceState, D3D12_RESOURCE_STATE_COPY_DEST);
|
||||||
@@ -1922,7 +1926,7 @@ static int D3D12_UpdateTextureInternal(D3D12_RenderData *rendererData, ID3D12Res
|
|||||||
srcLocation.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT;
|
srcLocation.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT;
|
||||||
srcLocation.PlacedFootprint = placedTextureDesc;
|
srcLocation.PlacedFootprint = placedTextureDesc;
|
||||||
|
|
||||||
D3D_CALL(rendererData->commandList, CopyTextureRegion,
|
ID3D12GraphicsCommandList2_CopyTextureRegion(rendererData->commandList,
|
||||||
&dstLocation,
|
&dstLocation,
|
||||||
x,
|
x,
|
||||||
y,
|
y,
|
||||||
@@ -2097,7 +2101,7 @@ static int D3D12_LockTexture(SDL_Renderer *renderer, SDL_Texture *texture,
|
|||||||
uploadDesc.Flags = D3D12_RESOURCE_FLAG_NONE;
|
uploadDesc.Flags = D3D12_RESOURCE_FLAG_NONE;
|
||||||
|
|
||||||
/* Figure out how much we need to allocate for the upload buffer */
|
/* Figure out how much we need to allocate for the upload buffer */
|
||||||
D3D_CALL(rendererData->d3dDevice, GetCopyableFootprints,
|
ID3D12Device1_GetCopyableFootprints(rendererData->d3dDevice,
|
||||||
&textureDesc,
|
&textureDesc,
|
||||||
0,
|
0,
|
||||||
1,
|
1,
|
||||||
@@ -2113,7 +2117,7 @@ static int D3D12_LockTexture(SDL_Renderer *renderer, SDL_Texture *texture,
|
|||||||
heapProps.VisibleNodeMask = 1;
|
heapProps.VisibleNodeMask = 1;
|
||||||
|
|
||||||
/* Create the upload buffer */
|
/* Create the upload buffer */
|
||||||
result = D3D_CALL(rendererData->d3dDevice, CreateCommittedResource,
|
result = ID3D12Device1_CreateCommittedResource(rendererData->d3dDevice,
|
||||||
&heapProps,
|
&heapProps,
|
||||||
D3D12_HEAP_FLAG_NONE,
|
D3D12_HEAP_FLAG_NONE,
|
||||||
&uploadDesc,
|
&uploadDesc,
|
||||||
@@ -2126,7 +2130,7 @@ static int D3D12_LockTexture(SDL_Renderer *renderer, SDL_Texture *texture,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Get a write-only pointer to data in the upload buffer: */
|
/* Get a write-only pointer to data in the upload buffer: */
|
||||||
result = D3D_CALL(textureData->stagingBuffer, Map,
|
result = ID3D12Resource_Map(textureData->stagingBuffer,
|
||||||
0,
|
0,
|
||||||
NULL,
|
NULL,
|
||||||
(void **)&textureMemory);
|
(void **)&textureMemory);
|
||||||
@@ -2186,7 +2190,7 @@ static void D3D12_UnlockTexture(SDL_Renderer *renderer, SDL_Texture *texture)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
/* Commit the pixel buffer's changes back to the staging texture: */
|
/* Commit the pixel buffer's changes back to the staging texture: */
|
||||||
D3D_CALL(textureData->stagingBuffer, Unmap, 0, NULL);
|
ID3D12Resource_Unmap(textureData->stagingBuffer, 0, NULL);
|
||||||
|
|
||||||
SDL_zero(textureDesc);
|
SDL_zero(textureDesc);
|
||||||
D3D_CALL_RET(textureData->mainTexture, GetDesc, &textureDesc);
|
D3D_CALL_RET(textureData->mainTexture, GetDesc, &textureDesc);
|
||||||
@@ -2222,7 +2226,7 @@ static void D3D12_UnlockTexture(SDL_Renderer *renderer, SDL_Texture *texture)
|
|||||||
srcLocation.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT;
|
srcLocation.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT;
|
||||||
srcLocation.PlacedFootprint = placedTextureDesc;
|
srcLocation.PlacedFootprint = placedTextureDesc;
|
||||||
|
|
||||||
D3D_CALL(rendererData->commandList, CopyTextureRegion,
|
ID3D12GraphicsCommandList2_CopyTextureRegion(rendererData->commandList,
|
||||||
&dstLocation,
|
&dstLocation,
|
||||||
textureData->lockedRect.x,
|
textureData->lockedRect.x,
|
||||||
textureData->lockedRect.y,
|
textureData->lockedRect.y,
|
||||||
@@ -2403,16 +2407,16 @@ static int D3D12_UpdateVertexBuffer(SDL_Renderer *renderer,
|
|||||||
}
|
}
|
||||||
|
|
||||||
vertexBuffer = rendererData->vertexBuffers[vbidx].resource;
|
vertexBuffer = rendererData->vertexBuffers[vbidx].resource;
|
||||||
result = D3D_CALL(vertexBuffer, Map, 0, &range, (void **)&vertexBufferData);
|
result = ID3D12Resource_Map(vertexBuffer, 0, &range, (void **)&vertexBufferData);
|
||||||
if (FAILED(result)) {
|
if (FAILED(result)) {
|
||||||
return WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D12Resource::Map [vertex buffer]"), result);
|
return WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D12Resource::Map [vertex buffer]"), result);
|
||||||
}
|
}
|
||||||
SDL_memcpy(vertexBufferData, vertexData, dataSizeInBytes);
|
SDL_memcpy(vertexBufferData, vertexData, dataSizeInBytes);
|
||||||
D3D_CALL(vertexBuffer, Unmap, 0, NULL);
|
ID3D12Resource_Unmap(vertexBuffer, 0, NULL);
|
||||||
|
|
||||||
rendererData->vertexBuffers[vbidx].view.SizeInBytes = (UINT)dataSizeInBytes;
|
rendererData->vertexBuffers[vbidx].view.SizeInBytes = (UINT)dataSizeInBytes;
|
||||||
|
|
||||||
D3D_CALL(rendererData->commandList, IASetVertexBuffers, 0, 1, &rendererData->vertexBuffers[vbidx].view);
|
ID3D12GraphicsCommandList2_IASetVertexBuffers(rendererData->commandList, 0, 1, &rendererData->vertexBuffers[vbidx].view);
|
||||||
|
|
||||||
rendererData->currentVertexBuffer++;
|
rendererData->currentVertexBuffer++;
|
||||||
if (rendererData->currentVertexBuffer >= SDL_D3D12_NUM_VERTEX_BUFFERS) {
|
if (rendererData->currentVertexBuffer >= SDL_D3D12_NUM_VERTEX_BUFFERS) {
|
||||||
@@ -2507,7 +2511,7 @@ static int D3D12_UpdateViewport(SDL_Renderer *renderer)
|
|||||||
d3dviewport.MinDepth = 0.0f;
|
d3dviewport.MinDepth = 0.0f;
|
||||||
d3dviewport.MaxDepth = 1.0f;
|
d3dviewport.MaxDepth = 1.0f;
|
||||||
/* SDL_Log("%s: D3D viewport = {%f,%f,%f,%f}\n", __FUNCTION__, d3dviewport.TopLeftX, d3dviewport.TopLeftY, d3dviewport.Width, d3dviewport.Height); */
|
/* SDL_Log("%s: D3D viewport = {%f,%f,%f,%f}\n", __FUNCTION__, d3dviewport.TopLeftX, d3dviewport.TopLeftY, d3dviewport.Width, d3dviewport.Height); */
|
||||||
D3D_CALL(data->commandList, RSSetViewports, 1, &d3dviewport);
|
ID3D12GraphicsCommandList_RSSetViewports(data->commandList, 1, &d3dviewport);
|
||||||
|
|
||||||
data->viewportDirty = SDL_FALSE;
|
data->viewportDirty = SDL_FALSE;
|
||||||
|
|
||||||
@@ -2632,8 +2636,8 @@ static int D3D12_SetDrawState(SDL_Renderer *renderer, const SDL_RenderCommand *c
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
D3D_CALL(rendererData->commandList, SetPipelineState, currentPipelineState->pipelineState);
|
ID3D12GraphicsCommandList2_SetPipelineState(rendererData->commandList, currentPipelineState->pipelineState);
|
||||||
D3D_CALL(rendererData->commandList, SetGraphicsRootSignature,
|
ID3D12GraphicsCommandList2_SetGraphicsRootSignature(rendererData->commandList,
|
||||||
rendererData->rootSignatures[D3D12_GetRootSignatureType(currentPipelineState->shader)]);
|
rendererData->rootSignatures[D3D12_GetRootSignatureType(currentPipelineState->shader)]);
|
||||||
/* When we change these we will need to re-upload the constant buffer and reset any descriptors */
|
/* When we change these we will need to re-upload the constant buffer and reset any descriptors */
|
||||||
updateSubresource = SDL_TRUE;
|
updateSubresource = SDL_TRUE;
|
||||||
@@ -2643,7 +2647,7 @@ static int D3D12_SetDrawState(SDL_Renderer *renderer, const SDL_RenderCommand *c
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (renderTargetView.ptr != rendererData->currentRenderTargetView.ptr) {
|
if (renderTargetView.ptr != rendererData->currentRenderTargetView.ptr) {
|
||||||
D3D_CALL(rendererData->commandList, OMSetRenderTargets, 1, &renderTargetView, FALSE, NULL);
|
ID3D12GraphicsCommandList2_OMSetRenderTargets(rendererData->commandList, 1, &renderTargetView, FALSE, NULL);
|
||||||
rendererData->currentRenderTargetView = renderTargetView;
|
rendererData->currentRenderTargetView = renderTargetView;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2660,7 +2664,7 @@ static int D3D12_SetDrawState(SDL_Renderer *renderer, const SDL_RenderCommand *c
|
|||||||
/* D3D12_GetViewportAlignedD3DRect will have set the SDL error */
|
/* D3D12_GetViewportAlignedD3DRect will have set the SDL error */
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
D3D_CALL(rendererData->commandList, RSSetScissorRects, 1, &scissorRect);
|
ID3D12GraphicsCommandList2_RSSetScissorRects(rendererData->commandList, 1, &scissorRect);
|
||||||
rendererData->cliprectDirty = SDL_FALSE;
|
rendererData->cliprectDirty = SDL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2672,7 +2676,7 @@ static int D3D12_SetDrawState(SDL_Renderer *renderer, const SDL_RenderCommand *c
|
|||||||
if (firstShaderResource.ptr != rendererData->currentShaderResource.ptr) {
|
if (firstShaderResource.ptr != rendererData->currentShaderResource.ptr) {
|
||||||
for (i = 0; i < numShaderResources; ++i) {
|
for (i = 0; i < numShaderResources; ++i) {
|
||||||
D3D12_GPU_DESCRIPTOR_HANDLE GPUHandle = D3D12_CPUtoGPUHandle(rendererData->srvDescriptorHeap, shaderResources[i]);
|
D3D12_GPU_DESCRIPTOR_HANDLE GPUHandle = D3D12_CPUtoGPUHandle(rendererData->srvDescriptorHeap, shaderResources[i]);
|
||||||
D3D_CALL(rendererData->commandList, SetGraphicsRootDescriptorTable, i + 2, GPUHandle);
|
ID3D12GraphicsCommandList2_SetGraphicsRootDescriptorTable(rendererData->commandList, i + 2, GPUHandle);
|
||||||
}
|
}
|
||||||
rendererData->currentShaderResource.ptr = firstShaderResource.ptr;
|
rendererData->currentShaderResource.ptr = firstShaderResource.ptr;
|
||||||
}
|
}
|
||||||
@@ -2694,13 +2698,13 @@ static int D3D12_SetDrawState(SDL_Renderer *renderer, const SDL_RenderCommand *c
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
D3D_CALL(rendererData->commandList, SetGraphicsRootDescriptorTable, tableIndex, GPUHandle);
|
ID3D12GraphicsCommandList2_SetGraphicsRootDescriptorTable(rendererData->commandList, tableIndex, GPUHandle);
|
||||||
rendererData->currentSampler = *sampler;
|
rendererData->currentSampler = *sampler;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (updateSubresource == SDL_TRUE || SDL_memcmp(&rendererData->vertexShaderConstantsData.model, newmatrix, sizeof(*newmatrix)) != 0) {
|
if (updateSubresource == SDL_TRUE || SDL_memcmp(&rendererData->vertexShaderConstantsData.model, newmatrix, sizeof(*newmatrix)) != 0) {
|
||||||
SDL_memcpy(&rendererData->vertexShaderConstantsData.model, newmatrix, sizeof(*newmatrix));
|
SDL_memcpy(&rendererData->vertexShaderConstantsData.model, newmatrix, sizeof(*newmatrix));
|
||||||
D3D_CALL(rendererData->commandList, SetGraphicsRoot32BitConstants,
|
ID3D12GraphicsCommandList2_SetGraphicsRoot32BitConstants(rendererData->commandList,
|
||||||
0,
|
0,
|
||||||
32,
|
32,
|
||||||
&rendererData->vertexShaderConstantsData,
|
&rendererData->vertexShaderConstantsData,
|
||||||
@@ -2714,7 +2718,7 @@ static int D3D12_SetDrawState(SDL_Renderer *renderer, const SDL_RenderCommand *c
|
|||||||
|
|
||||||
if (updateSubresource == SDL_TRUE ||
|
if (updateSubresource == SDL_TRUE ||
|
||||||
SDL_memcmp(shader_constants, ¤tPipelineState->shader_constants, sizeof(*shader_constants)) != 0) {
|
SDL_memcmp(shader_constants, ¤tPipelineState->shader_constants, sizeof(*shader_constants)) != 0) {
|
||||||
D3D_CALL(rendererData->commandList, SetGraphicsRoot32BitConstants,
|
ID3D12GraphicsCommandList2_SetGraphicsRoot32BitConstants(rendererData->commandList,
|
||||||
1,
|
1,
|
||||||
sizeof(*shader_constants) / sizeof(float),
|
sizeof(*shader_constants) / sizeof(float),
|
||||||
shader_constants,
|
shader_constants,
|
||||||
@@ -2802,8 +2806,8 @@ static int D3D12_SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *c
|
|||||||
static void D3D12_DrawPrimitives(SDL_Renderer *renderer, D3D12_PRIMITIVE_TOPOLOGY primitiveTopology, const size_t vertexStart, const size_t vertexCount)
|
static void D3D12_DrawPrimitives(SDL_Renderer *renderer, D3D12_PRIMITIVE_TOPOLOGY primitiveTopology, const size_t vertexStart, const size_t vertexCount)
|
||||||
{
|
{
|
||||||
D3D12_RenderData *rendererData = (D3D12_RenderData *)renderer->internal;
|
D3D12_RenderData *rendererData = (D3D12_RenderData *)renderer->internal;
|
||||||
D3D_CALL(rendererData->commandList, IASetPrimitiveTopology, primitiveTopology);
|
ID3D12GraphicsCommandList2_IASetPrimitiveTopology(rendererData->commandList, primitiveTopology);
|
||||||
D3D_CALL(rendererData->commandList, DrawInstanced, (UINT)vertexCount, 1, (UINT)vertexStart, 0);
|
ID3D12GraphicsCommandList2_DrawInstanced(rendererData->commandList, (UINT)vertexCount, 1, (UINT)vertexStart, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void D3D12_InvalidateCachedState(SDL_Renderer *renderer)
|
static void D3D12_InvalidateCachedState(SDL_Renderer *renderer)
|
||||||
@@ -2888,7 +2892,7 @@ static int D3D12_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd,
|
|||||||
color.r *= cmd->data.color.color_scale;
|
color.r *= cmd->data.color.color_scale;
|
||||||
color.g *= cmd->data.color.color_scale;
|
color.g *= cmd->data.color.color_scale;
|
||||||
color.b *= cmd->data.color.color_scale;
|
color.b *= cmd->data.color.color_scale;
|
||||||
D3D_CALL(rendererData->commandList, ClearRenderTargetView, rtvDescriptor, &color.r, 0, NULL);
|
ID3D12GraphicsCommandList2_ClearRenderTargetView(rendererData->commandList, rtvDescriptor, &color.r, 0, NULL);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2996,7 +3000,7 @@ static SDL_Surface *D3D12_RenderReadPixels(SDL_Renderer *renderer, const SDL_Rec
|
|||||||
readbackDesc.Flags = D3D12_RESOURCE_FLAG_NONE;
|
readbackDesc.Flags = D3D12_RESOURCE_FLAG_NONE;
|
||||||
|
|
||||||
/* Figure out how much we need to allocate for the upload buffer */
|
/* Figure out how much we need to allocate for the upload buffer */
|
||||||
D3D_CALL(data->d3dDevice, GetCopyableFootprints,
|
ID3D12Device1_GetCopyableFootprints(data->d3dDevice,
|
||||||
&textureDesc,
|
&textureDesc,
|
||||||
0,
|
0,
|
||||||
1,
|
1,
|
||||||
@@ -3011,7 +3015,7 @@ static SDL_Surface *D3D12_RenderReadPixels(SDL_Renderer *renderer, const SDL_Rec
|
|||||||
heapProps.CreationNodeMask = 1;
|
heapProps.CreationNodeMask = 1;
|
||||||
heapProps.VisibleNodeMask = 1;
|
heapProps.VisibleNodeMask = 1;
|
||||||
|
|
||||||
result = D3D_CALL(data->d3dDevice, CreateCommittedResource,
|
result = ID3D12Device1_CreateCommittedResource(data->d3dDevice,
|
||||||
&heapProps,
|
&heapProps,
|
||||||
D3D12_HEAP_FLAG_NONE,
|
D3D12_HEAP_FLAG_NONE,
|
||||||
&readbackDesc,
|
&readbackDesc,
|
||||||
@@ -3062,7 +3066,7 @@ static SDL_Surface *D3D12_RenderReadPixels(SDL_Renderer *renderer, const SDL_Rec
|
|||||||
srcLocation.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX;
|
srcLocation.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX;
|
||||||
srcLocation.SubresourceIndex = 0;
|
srcLocation.SubresourceIndex = 0;
|
||||||
|
|
||||||
D3D_CALL(data->commandList, CopyTextureRegion,
|
ID3D12GraphicsCommandList2_CopyTextureRegion(data->commandList,
|
||||||
&dstLocation,
|
&dstLocation,
|
||||||
0, 0, 0,
|
0, 0, 0,
|
||||||
&srcLocation,
|
&srcLocation,
|
||||||
@@ -3075,7 +3079,7 @@ static SDL_Surface *D3D12_RenderReadPixels(SDL_Renderer *renderer, const SDL_Rec
|
|||||||
D3D12_TransitionResource(data, backBuffer, D3D12_RESOURCE_STATE_COPY_SOURCE, D3D12_RESOURCE_STATE_RENDER_TARGET);
|
D3D12_TransitionResource(data, backBuffer, D3D12_RESOURCE_STATE_COPY_SOURCE, D3D12_RESOURCE_STATE_RENDER_TARGET);
|
||||||
|
|
||||||
/* Map the staging texture's data to CPU-accessible memory: */
|
/* Map the staging texture's data to CPU-accessible memory: */
|
||||||
result = D3D_CALL(readbackBuffer, Map,
|
result = ID3D12Resource_Map(readbackBuffer,
|
||||||
0,
|
0,
|
||||||
NULL,
|
NULL,
|
||||||
(void **)&textureMemory);
|
(void **)&textureMemory);
|
||||||
@@ -3092,7 +3096,7 @@ static SDL_Surface *D3D12_RenderReadPixels(SDL_Renderer *renderer, const SDL_Rec
|
|||||||
pitchedDesc.RowPitch);
|
pitchedDesc.RowPitch);
|
||||||
|
|
||||||
/* Unmap the texture: */
|
/* Unmap the texture: */
|
||||||
D3D_CALL(readbackBuffer, Unmap, 0, NULL);
|
ID3D12Resource_Unmap(readbackBuffer, 0, NULL);
|
||||||
|
|
||||||
done:
|
done:
|
||||||
D3D_SAFE_RELEASE(readbackBuffer);
|
D3D_SAFE_RELEASE(readbackBuffer);
|
||||||
@@ -3111,8 +3115,8 @@ static int D3D12_RenderPresent(SDL_Renderer *renderer)
|
|||||||
D3D12_RESOURCE_STATE_PRESENT);
|
D3D12_RESOURCE_STATE_PRESENT);
|
||||||
|
|
||||||
/* Issue the command list */
|
/* Issue the command list */
|
||||||
result = D3D_CALL(data->commandList, Close);
|
result = ID3D12GraphicsCommandList2_Close(data->commandList);
|
||||||
D3D_CALL(data->commandQueue, ExecuteCommandLists, 1, (ID3D12CommandList *const *)&data->commandList);
|
ID3D12CommandQueue_ExecuteCommandLists(data->commandQueue, 1, (ID3D12CommandList *const *)&data->commandList);
|
||||||
|
|
||||||
#if defined(SDL_PLATFORM_XBOXONE) || defined(SDL_PLATFORM_XBOXSERIES)
|
#if defined(SDL_PLATFORM_XBOXONE) || defined(SDL_PLATFORM_XBOXSERIES)
|
||||||
result = D3D12_XBOX_PresentFrame(data->commandQueue, data->frameToken, data->renderTargets[data->currentBackBufferIndex]);
|
result = D3D12_XBOX_PresentFrame(data->commandQueue, data->frameToken, data->renderTargets[data->currentBackBufferIndex]);
|
||||||
@@ -3120,7 +3124,7 @@ static int D3D12_RenderPresent(SDL_Renderer *renderer)
|
|||||||
/* The application may optionally specify "dirty" or "scroll"
|
/* The application may optionally specify "dirty" or "scroll"
|
||||||
* rects to improve efficiency in certain scenarios.
|
* rects to improve efficiency in certain scenarios.
|
||||||
*/
|
*/
|
||||||
result = D3D_CALL(data->swapChain, Present, data->syncInterval, data->presentFlags);
|
result = IDXGISwapChain_Present(data->swapChain, data->syncInterval, data->presentFlags);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (FAILED(result) && result != DXGI_ERROR_WAS_STILL_DRAWING) {
|
if (FAILED(result) && result != DXGI_ERROR_WAS_STILL_DRAWING) {
|
||||||
@@ -3138,10 +3142,10 @@ static int D3D12_RenderPresent(SDL_Renderer *renderer)
|
|||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
/* Wait for the GPU and move to the next frame */
|
/* Wait for the GPU and move to the next frame */
|
||||||
result = D3D_CALL(data->commandQueue, Signal, data->fence, data->fenceValue);
|
result = ID3D12CommandQueue_Signal(data->commandQueue, data->fence, data->fenceValue);
|
||||||
|
|
||||||
if (D3D_CALL(data->fence, GetCompletedValue) < data->fenceValue) {
|
if (ID3D12Fence_GetCompletedValue(data->fence) < data->fenceValue) {
|
||||||
result = D3D_CALL(data->fence, SetEventOnCompletion,
|
result = ID3D12Fence_SetEventOnCompletion(data->fence,
|
||||||
data->fenceValue,
|
data->fenceValue,
|
||||||
data->fenceEvent);
|
data->fenceEvent);
|
||||||
WaitForSingleObjectEx(data->fenceEvent, INFINITE, FALSE);
|
WaitForSingleObjectEx(data->fenceEvent, INFINITE, FALSE);
|
||||||
@@ -3152,7 +3156,7 @@ static int D3D12_RenderPresent(SDL_Renderer *renderer)
|
|||||||
data->currentBackBufferIndex++;
|
data->currentBackBufferIndex++;
|
||||||
data->currentBackBufferIndex %= SDL_D3D12_NUM_BUFFERS;
|
data->currentBackBufferIndex %= SDL_D3D12_NUM_BUFFERS;
|
||||||
#else
|
#else
|
||||||
data->currentBackBufferIndex = D3D_CALL(data->swapChain, GetCurrentBackBufferIndex);
|
data->currentBackBufferIndex = IDXGISwapChain4_GetCurrentBackBufferIndex(data->swapChain);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Reset the command allocator and command list, and transition back to render target */
|
/* Reset the command allocator and command list, and transition back to render target */
|
||||||
|
@@ -25,7 +25,7 @@
|
|||||||
#include <SDL3/SDL_stdinc.h>
|
#include <SDL3/SDL_stdinc.h>
|
||||||
|
|
||||||
#include "../../core/windows/SDL_windows.h"
|
#include "../../core/windows/SDL_windows.h"
|
||||||
#include <d3d12_x.h>
|
#include "../../video/directx/SDL_d3d12.h"
|
||||||
|
|
||||||
#include "SDL_shaders_d3d12.h"
|
#include "SDL_shaders_d3d12.h"
|
||||||
|
|
||||||
|
@@ -25,7 +25,7 @@
|
|||||||
#include <SDL3/SDL_stdinc.h>
|
#include <SDL3/SDL_stdinc.h>
|
||||||
|
|
||||||
#include "../../core/windows/SDL_windows.h"
|
#include "../../core/windows/SDL_windows.h"
|
||||||
#include <d3d12_xs.h>
|
#include "../../video/directx/SDL_d3d12.h"
|
||||||
|
|
||||||
#include "SDL_shaders_d3d12.h"
|
#include "SDL_shaders_d3d12.h"
|
||||||
|
|
||||||
|
@@ -50,8 +50,9 @@
|
|||||||
X = NULL; \
|
X = NULL; \
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME: Remove this in favor of the COBJMACROS defines */
|
/* Some D3D12 calls are mismatched between Windows/Xbox, so we need to wrap the
|
||||||
#define D3D_CALL(THIS, FUNC, ...) (THIS)->lpVtbl->FUNC((THIS), ##__VA_ARGS__)
|
* C function ourselves :(
|
||||||
|
*/
|
||||||
#define D3D_CALL_RET(THIS, FUNC, ...) (THIS)->lpVtbl->FUNC((THIS), ##__VA_ARGS__)
|
#define D3D_CALL_RET(THIS, FUNC, ...) (THIS)->lpVtbl->FUNC((THIS), ##__VA_ARGS__)
|
||||||
|
|
||||||
#else /* !(defined(SDL_PLATFORM_XBOXONE) || defined(SDL_PLATFORM_XBOXSERIES)) */
|
#else /* !(defined(SDL_PLATFORM_XBOXONE) || defined(SDL_PLATFORM_XBOXSERIES)) */
|
||||||
@@ -78,8 +79,12 @@
|
|||||||
/* DXGI_PRESENT flags are removed on Xbox */
|
/* DXGI_PRESENT flags are removed on Xbox */
|
||||||
#define DXGI_PRESENT_ALLOW_TEARING 0
|
#define DXGI_PRESENT_ALLOW_TEARING 0
|
||||||
|
|
||||||
/* FIXME: Xbox D3D12 does not define the COBJMACROS, so we need to define them ourselves */
|
/* Xbox D3D12 does not define the COBJMACROS, so we need to define them ourselves */
|
||||||
#define D3D_CALL(THIS, FUNC, ...) (THIS)->FUNC(__VA_ARGS__)
|
#include "SDL_d3d12_xbox_cmacros.h"
|
||||||
|
|
||||||
|
/* Xbox's D3D12 ABI actually varies from Windows, if a function does not exist
|
||||||
|
* in the above header then you need to use this instead :(
|
||||||
|
*/
|
||||||
#define D3D_CALL_RET(THIS, FUNC, RETVAL, ...) *(RETVAL) = (THIS)->FUNC(__VA_ARGS__)
|
#define D3D_CALL_RET(THIS, FUNC, RETVAL, ...) *(RETVAL) = (THIS)->FUNC(__VA_ARGS__)
|
||||||
|
|
||||||
#endif /* !(defined(SDL_PLATFORM_XBOXONE) || defined(SDL_PLATFORM_XBOXSERIES)) */
|
#endif /* !(defined(SDL_PLATFORM_XBOXONE) || defined(SDL_PLATFORM_XBOXSERIES)) */
|
||||||
|
4761
src/video/directx/SDL_d3d12_xbox_cmacros.h
Normal file
4761
src/video/directx/SDL_d3d12_xbox_cmacros.h
Normal file
File diff suppressed because it is too large
Load Diff
91
src/video/directx/gen_xbox_cmacros.cs
Normal file
91
src/video/directx/gen_xbox_cmacros.cs
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2024 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Build and run this any time you update d3d12.h/d3d12sdklayers.h! */
|
||||||
|
|
||||||
|
using System.IO;
|
||||||
|
|
||||||
|
class Program
|
||||||
|
{
|
||||||
|
static void GenMacros(string[] input, StreamWriter output)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < input.Length; i += 1)
|
||||||
|
{
|
||||||
|
if (input[i].StartsWith("#define I"))
|
||||||
|
{
|
||||||
|
// Strip out the bad ABI calls, use D3D_CALL_RET instead!
|
||||||
|
if (input[i].Contains("_GetDesc(") ||
|
||||||
|
input[i].Contains("_GetDesc1(") ||
|
||||||
|
input[i].Contains("_GetCPUDescriptorHandleForHeapStart(") ||
|
||||||
|
input[i].Contains("_GetGPUDescriptorHandleForHeapStart(") ||
|
||||||
|
input[i].Contains("_GetResourceAllocationInfo(") ||
|
||||||
|
input[i].Contains("_GetResourceAllocationInfo1(") ||
|
||||||
|
input[i].Contains("_GetResourceAllocationInfo2(") ||
|
||||||
|
input[i].Contains("_GetResourceAllocationInfo3(") ||
|
||||||
|
input[i].Contains("_GetCustomHeapProperties(") ||
|
||||||
|
input[i].Contains("_GetAdapterLuid(") ||
|
||||||
|
input[i].Contains("_GetLUID(") ||
|
||||||
|
input[i].Contains("_GetProgramIdentifier(") ||
|
||||||
|
input[i].Contains("_GetNodeID(") ||
|
||||||
|
input[i].Contains("_GetEntrypointID("))
|
||||||
|
{
|
||||||
|
// May as well skip the next line...
|
||||||
|
i += 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The first line is fine as-is.
|
||||||
|
output.WriteLine(input[i]);
|
||||||
|
|
||||||
|
// The second line, however...
|
||||||
|
i += 1;
|
||||||
|
|
||||||
|
string notThis;
|
||||||
|
if (input[i].LastIndexOf("This,") > -1)
|
||||||
|
{
|
||||||
|
// Function with arguments
|
||||||
|
notThis = "This,";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Function with no arguments
|
||||||
|
notThis = "This";
|
||||||
|
}
|
||||||
|
|
||||||
|
int lastNotThis = input[i].LastIndexOf(notThis);
|
||||||
|
string alias = input[i].Substring(0, lastNotThis).Replace("lpVtbl -> ", "");
|
||||||
|
string definition = input[i].Substring(lastNotThis).Replace(notThis, "");
|
||||||
|
output.WriteLine(alias + definition);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Main(string[] args)
|
||||||
|
{
|
||||||
|
using (FileStream SDL_d3d12_xbox_cmacros_h = File.OpenWrite("SDL_d3d12_xbox_cmacros.h"))
|
||||||
|
using (StreamWriter output = new StreamWriter(SDL_d3d12_xbox_cmacros_h))
|
||||||
|
{
|
||||||
|
output.WriteLine("/* This file is autogenerated, DO NOT MODIFY */");
|
||||||
|
GenMacros(File.ReadAllLines("d3d12.h"), output);
|
||||||
|
GenMacros(File.ReadAllLines("d3d12sdklayers.h"), output);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user