forked from MoonsideGames/Refresh
Fixed uniform offsets, removed a bunch of code from cdefines.h
parent
ff0f30a986
commit
f91c18e85c
|
@ -30,7 +30,9 @@
|
|||
#define CINTERFACE
|
||||
#define COBJMACROS
|
||||
#include <d3d11.h>
|
||||
#include <d3d11_1.h>
|
||||
#include <dxgi.h>
|
||||
#include <dxgi1_6.h>
|
||||
#include <d3dcompiler.h>
|
||||
|
||||
#include "Refresh_Driver.h"
|
||||
|
@ -429,7 +431,7 @@ typedef struct D3D11UniformBuffer
|
|||
typedef struct D3D11CommandBuffer
|
||||
{
|
||||
/* D3D11 Object References */
|
||||
ID3D11DeviceContext *context;
|
||||
ID3D11DeviceContext1 *context;
|
||||
D3D11SwapchainData *swapchainData;
|
||||
|
||||
/* Render Pass */
|
||||
|
@ -457,7 +459,7 @@ typedef struct D3D11Sampler
|
|||
|
||||
typedef struct D3D11Renderer
|
||||
{
|
||||
ID3D11Device *device;
|
||||
ID3D11Device1 *device;
|
||||
ID3D11DeviceContext *immediateContext;
|
||||
IDXGIFactory1 *factory;
|
||||
IDXGIAdapter1 *adapter;
|
||||
|
@ -493,7 +495,7 @@ typedef struct D3D11Renderer
|
|||
/* Logging */
|
||||
|
||||
static void D3D11_INTERNAL_LogError(
|
||||
ID3D11Device *device,
|
||||
ID3D11Device1 *device,
|
||||
const char *msg,
|
||||
HRESULT res
|
||||
) {
|
||||
|
@ -631,24 +633,32 @@ static void D3D11_DrawInstancedPrimitives(
|
|||
uint32_t fragmentParamOffset
|
||||
) {
|
||||
D3D11CommandBuffer *d3d11CommandBuffer = (D3D11CommandBuffer*) commandBuffer;
|
||||
uint32_t vertexOffsetInConstants = vertexParamOffset / 16;
|
||||
uint32_t fragmentOffsetInConstants = fragmentParamOffset / 16;
|
||||
uint32_t vertexBlockSizeInConstants = d3d11CommandBuffer->graphicsPipeline->vertexUniformBlockSize / 16;
|
||||
uint32_t fragmentBlockSizeInConstants = d3d11CommandBuffer->graphicsPipeline->fragmentUniformBlockSize / 16;
|
||||
|
||||
if (d3d11CommandBuffer->vertexUniformBuffer != NULL)
|
||||
{
|
||||
ID3D11DeviceContext_VSSetConstantBuffers(
|
||||
ID3D11DeviceContext1_VSSetConstantBuffers1(
|
||||
d3d11CommandBuffer->context,
|
||||
0,
|
||||
1,
|
||||
&d3d11CommandBuffer->vertexUniformBuffer->d3d11Buffer->handle
|
||||
&d3d11CommandBuffer->vertexUniformBuffer->d3d11Buffer->handle,
|
||||
&vertexOffsetInConstants,
|
||||
&vertexBlockSizeInConstants
|
||||
);
|
||||
}
|
||||
|
||||
if (d3d11CommandBuffer->fragmentUniformBuffer != NULL)
|
||||
{
|
||||
ID3D11DeviceContext_PSSetConstantBuffers(
|
||||
ID3D11DeviceContext1_PSSetConstantBuffers1(
|
||||
d3d11CommandBuffer->context,
|
||||
0,
|
||||
1,
|
||||
&d3d11CommandBuffer->fragmentUniformBuffer->d3d11Buffer->handle
|
||||
&d3d11CommandBuffer->fragmentUniformBuffer->d3d11Buffer->handle,
|
||||
&fragmentOffsetInConstants,
|
||||
&fragmentBlockSizeInConstants
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -660,8 +670,6 @@ static void D3D11_DrawInstancedPrimitives(
|
|||
baseVertex,
|
||||
0
|
||||
);
|
||||
|
||||
/* FIXME: vertex/fragment param offsets */
|
||||
}
|
||||
|
||||
static void D3D11_DrawIndexedPrimitives(
|
||||
|
@ -694,24 +702,32 @@ static void D3D11_DrawPrimitives(
|
|||
uint32_t fragmentParamOffset
|
||||
) {
|
||||
D3D11CommandBuffer *d3d11CommandBuffer = (D3D11CommandBuffer*) commandBuffer;
|
||||
uint32_t vertexOffsetInConstants = vertexParamOffset / 16;
|
||||
uint32_t fragmentOffsetInConstants = fragmentParamOffset / 16;
|
||||
uint32_t vertexBlockSizeInConstants = d3d11CommandBuffer->graphicsPipeline->vertexUniformBlockSize / 16;
|
||||
uint32_t fragmentBlockSizeInConstants = d3d11CommandBuffer->graphicsPipeline->fragmentUniformBlockSize / 16;
|
||||
|
||||
if (d3d11CommandBuffer->vertexUniformBuffer != NULL)
|
||||
{
|
||||
ID3D11DeviceContext_VSSetConstantBuffers(
|
||||
ID3D11DeviceContext1_VSSetConstantBuffers1(
|
||||
d3d11CommandBuffer->context,
|
||||
0,
|
||||
1,
|
||||
&d3d11CommandBuffer->vertexUniformBuffer->d3d11Buffer->handle
|
||||
&d3d11CommandBuffer->vertexUniformBuffer->d3d11Buffer->handle,
|
||||
&vertexOffsetInConstants,
|
||||
&vertexBlockSizeInConstants
|
||||
);
|
||||
}
|
||||
|
||||
if (d3d11CommandBuffer->fragmentUniformBuffer != NULL)
|
||||
{
|
||||
ID3D11DeviceContext_PSSetConstantBuffers(
|
||||
ID3D11DeviceContext1_PSSetConstantBuffers1(
|
||||
d3d11CommandBuffer->context,
|
||||
0,
|
||||
1,
|
||||
&d3d11CommandBuffer->fragmentUniformBuffer->d3d11Buffer->handle
|
||||
&d3d11CommandBuffer->fragmentUniformBuffer->d3d11Buffer->handle,
|
||||
&fragmentOffsetInConstants,
|
||||
&fragmentBlockSizeInConstants
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -975,6 +991,13 @@ static Refresh_ComputePipeline* D3D11_CreateComputePipeline(
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static inline uint32_t D3D11_INTERNAL_NextHighestAlignment(
|
||||
uint32_t n,
|
||||
uint32_t align
|
||||
) {
|
||||
return align * ((n + align - 1) / align);
|
||||
}
|
||||
|
||||
static Refresh_GraphicsPipeline* D3D11_CreateGraphicsPipeline(
|
||||
Refresh_Renderer *driverData,
|
||||
Refresh_GraphicsPipelineCreateInfo *pipelineCreateInfo
|
||||
|
@ -1068,7 +1091,10 @@ static Refresh_GraphicsPipeline* D3D11_CreateGraphicsPipeline(
|
|||
}
|
||||
pipeline->vertexShader = (ID3D11VertexShader*) vertShaderModule->shader;
|
||||
pipeline->numVertexSamplers = pipelineCreateInfo->vertexShaderInfo.samplerBindingCount;
|
||||
pipeline->vertexUniformBlockSize = (uint32_t) pipelineCreateInfo->vertexShaderInfo.uniformBufferSize;
|
||||
pipeline->vertexUniformBlockSize = D3D11_INTERNAL_NextHighestAlignment(
|
||||
(uint32_t) pipelineCreateInfo->vertexShaderInfo.uniformBufferSize,
|
||||
256
|
||||
);
|
||||
|
||||
/* Input Layout */
|
||||
|
||||
|
@ -1131,7 +1157,10 @@ static Refresh_GraphicsPipeline* D3D11_CreateGraphicsPipeline(
|
|||
}
|
||||
pipeline->fragmentShader = (ID3D11PixelShader*) fragShaderModule->shader;
|
||||
pipeline->numFragmentSamplers = pipelineCreateInfo->fragmentShaderInfo.samplerBindingCount;
|
||||
pipeline->fragmentUniformBlockSize = (uint32_t) pipelineCreateInfo->fragmentShaderInfo.uniformBufferSize;
|
||||
pipeline->fragmentUniformBlockSize = D3D11_INTERNAL_NextHighestAlignment(
|
||||
(uint32_t) pipelineCreateInfo->vertexShaderInfo.uniformBufferSize,
|
||||
256
|
||||
);
|
||||
|
||||
return (Refresh_GraphicsPipeline*) pipeline;
|
||||
}
|
||||
|
@ -1681,7 +1710,7 @@ static uint32_t D3D11_PushVertexShaderUniforms(
|
|||
d3d11CommandBuffer->vertexUniformBuffer->offset,
|
||||
data,
|
||||
dataLengthInBytes,
|
||||
0
|
||||
0 /* FIXME: Should be NoOverwrite! */
|
||||
);
|
||||
|
||||
d3d11CommandBuffer->vertexUniformBuffer->offset += graphicsPipeline->vertexUniformBlockSize;
|
||||
|
@ -1722,7 +1751,7 @@ static uint32_t D3D11_PushFragmentShaderUniforms(
|
|||
d3d11CommandBuffer->fragmentUniformBuffer->offset,
|
||||
data,
|
||||
dataLengthInBytes,
|
||||
0
|
||||
0 /* FIXME: Should be NoOverwrite! */
|
||||
);
|
||||
|
||||
d3d11CommandBuffer->fragmentUniformBuffer->offset += graphicsPipeline->fragmentUniformBlockSize;
|
||||
|
@ -1893,7 +1922,7 @@ static void D3D11_INTERNAL_AllocateCommandBuffers(
|
|||
commandBuffer = SDL_malloc(sizeof(D3D11CommandBuffer));
|
||||
|
||||
/* Deferred Device Context */
|
||||
res = ID3D11Device_CreateDeferredContext(
|
||||
res = ID3D11Device1_CreateDeferredContext1(
|
||||
renderer->device,
|
||||
0,
|
||||
&commandBuffer->context
|
||||
|
@ -1958,6 +1987,7 @@ static Refresh_CommandBuffer* D3D11_AcquireCommandBuffer(
|
|||
commandBuffer->swapchainData = NULL;
|
||||
commandBuffer->graphicsPipeline = NULL;
|
||||
commandBuffer->vertexUniformBuffer = NULL;
|
||||
commandBuffer->fragmentUniformBuffer = NULL;
|
||||
commandBuffer->dsView = NULL;
|
||||
for (i = 0; i < MAX_COLOR_TARGET_BINDINGS; i += 1)
|
||||
{
|
||||
|
@ -3122,6 +3152,7 @@ static Refresh_Device* D3D11_CreateDevice(
|
|||
}
|
||||
|
||||
/* Create the device */
|
||||
ID3D11Device *d3d11Device;
|
||||
tryCreateDevice:
|
||||
res = D3D11CreateDeviceFunc(
|
||||
(IDXGIAdapter*) renderer->adapter,
|
||||
|
@ -3131,7 +3162,7 @@ tryCreateDevice:
|
|||
levels,
|
||||
SDL_arraysize(levels),
|
||||
D3D11_SDK_VERSION,
|
||||
&renderer->device,
|
||||
&d3d11Device,
|
||||
&renderer->featureLevel,
|
||||
&renderer->immediateContext
|
||||
);
|
||||
|
@ -3146,6 +3177,14 @@ tryCreateDevice:
|
|||
|
||||
ERROR_CHECK_RETURN("Could not create D3D11 device", NULL);
|
||||
|
||||
/* The actual device we want is the ID3D11Device1 interface... */
|
||||
res = ID3D11Device_QueryInterface(
|
||||
d3d11Device,
|
||||
&D3D_IID_ID3D11Device1,
|
||||
&renderer->device
|
||||
);
|
||||
ERROR_CHECK_RETURN("Could not get ID3D11Device1 interface", NULL);
|
||||
|
||||
/* Print driver info */
|
||||
Refresh_LogInfo("Refresh Driver: D3D11");
|
||||
Refresh_LogInfo("D3D11 Adapter: %S", adapterDesc.Description);
|
||||
|
|
|
@ -33,183 +33,4 @@ static const IID D3D_IID_IDXGIFactory1 = { 0x770aae78,0xf26f,0x4dba,{0xa8,0x29,0
|
|||
static const IID D3D_IID_IDXGIFactory6 = { 0xc1b6694f,0xff09,0x44a9,{0xb0,0x3c,0x77,0x90,0x0a,0x0a,0x1d,0x17} };
|
||||
static const IID D3D_IID_IDXGIAdapter1 = { 0x29038f61,0x3839,0x4626,{0x91,0xfd,0x08,0x68,0x79,0x01,0x1a,0x05} };
|
||||
static const IID D3D_IID_ID3D11Texture2D = { 0x6f15aaf2,0xd208,0x4e89,{0x9a,0xb4,0x48,0x95,0x35,0xd3,0x4f,0x9c} };
|
||||
|
||||
/* IDXGIFactory6 (taken from dxgi1_6.h, cleaned up a bit) */
|
||||
typedef enum
|
||||
{
|
||||
DXGI_FEATURE_PRESENT_ALLOW_TEARING = 0
|
||||
} DXGI_FEATURE;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
DXGI_GPU_PREFERENCE_UNSPECIFIED = 0,
|
||||
DXGI_GPU_PREFERENCE_MINIMUM_POWER = (DXGI_GPU_PREFERENCE_UNSPECIFIED + 1),
|
||||
DXGI_GPU_PREFERENCE_HIGH_PERFORMANCE = (DXGI_GPU_PREFERENCE_MINIMUM_POWER + 1)
|
||||
} DXGI_GPU_PREFERENCE;
|
||||
|
||||
typedef struct IDXGIFactory6 IDXGIFactory6;
|
||||
typedef struct IDXGIFactory6Vtbl
|
||||
{
|
||||
HRESULT(STDMETHODCALLTYPE* QueryInterface)(
|
||||
IDXGIFactory6* This,
|
||||
REFIID riid,
|
||||
void** ppvObject);
|
||||
|
||||
ULONG(STDMETHODCALLTYPE* AddRef)(
|
||||
IDXGIFactory6* This);
|
||||
|
||||
ULONG(STDMETHODCALLTYPE* Release)(
|
||||
IDXGIFactory6* This);
|
||||
|
||||
HRESULT(STDMETHODCALLTYPE* SetPrivateData)(
|
||||
IDXGIFactory6* This,
|
||||
REFGUID Name,
|
||||
UINT DataSize,
|
||||
const void* pData);
|
||||
|
||||
HRESULT(STDMETHODCALLTYPE* SetPrivateDataInterface)(
|
||||
IDXGIFactory6* This,
|
||||
REFGUID Name,
|
||||
const IUnknown* pUnknown);
|
||||
|
||||
HRESULT(STDMETHODCALLTYPE* GetPrivateData)(
|
||||
IDXGIFactory6* This,
|
||||
REFGUID Name,
|
||||
UINT* pDataSize,
|
||||
void* pData);
|
||||
|
||||
HRESULT(STDMETHODCALLTYPE* GetParent)(
|
||||
IDXGIFactory6* This,
|
||||
REFIID riid,
|
||||
void** ppParent);
|
||||
|
||||
HRESULT(STDMETHODCALLTYPE* EnumAdapters)(
|
||||
IDXGIFactory6* This,
|
||||
UINT Adapter,
|
||||
IDXGIAdapter** ppAdapter);
|
||||
|
||||
HRESULT(STDMETHODCALLTYPE* MakeWindowAssociation)(
|
||||
IDXGIFactory6* This,
|
||||
HWND WindowHandle,
|
||||
UINT Flags);
|
||||
|
||||
HRESULT(STDMETHODCALLTYPE* GetWindowAssociation)(
|
||||
IDXGIFactory6* This,
|
||||
HWND* pWindowHandle);
|
||||
|
||||
HRESULT(STDMETHODCALLTYPE* CreateSwapChain)(
|
||||
IDXGIFactory6* This,
|
||||
IUnknown* pDevice,
|
||||
DXGI_SWAP_CHAIN_DESC* pDesc,
|
||||
IDXGISwapChain** ppSwapChain);
|
||||
|
||||
HRESULT(STDMETHODCALLTYPE* CreateSoftwareAdapter)(
|
||||
IDXGIFactory6* This,
|
||||
HMODULE Module,
|
||||
IDXGIAdapter** ppAdapter);
|
||||
|
||||
HRESULT(STDMETHODCALLTYPE* EnumAdapters1)(
|
||||
IDXGIFactory6* This,
|
||||
UINT Adapter,
|
||||
IDXGIAdapter1** ppAdapter);
|
||||
|
||||
BOOL(STDMETHODCALLTYPE* IsCurrent)(
|
||||
IDXGIFactory6* This);
|
||||
|
||||
BOOL(STDMETHODCALLTYPE* IsWindowedStereoEnabled)(
|
||||
IDXGIFactory6* This);
|
||||
|
||||
HRESULT(STDMETHODCALLTYPE* CreateSwapChainForHwnd)(
|
||||
IDXGIFactory6* This,
|
||||
IUnknown* pDevice,
|
||||
HWND hWnd,
|
||||
void* pDesc,
|
||||
void* pFullscreenDesc,
|
||||
void* pRestrictToOutput,
|
||||
void** ppSwapChain);
|
||||
|
||||
HRESULT(STDMETHODCALLTYPE* CreateSwapChainForCoreWindow)(
|
||||
IDXGIFactory6* This,
|
||||
IUnknown* pDevice,
|
||||
IUnknown* pWindow,
|
||||
void* pDesc,
|
||||
void* pRestrictToOutput,
|
||||
void** ppSwapChain);
|
||||
|
||||
HRESULT(STDMETHODCALLTYPE* GetSharedResourceAdapterLuid)(
|
||||
IDXGIFactory6* This,
|
||||
HANDLE hResource,
|
||||
LUID* pLuid);
|
||||
|
||||
HRESULT(STDMETHODCALLTYPE* RegisterStereoStatusWindow)(
|
||||
IDXGIFactory6* This,
|
||||
HWND WindowHandle,
|
||||
UINT wMsg,
|
||||
DWORD* pdwCookie);
|
||||
|
||||
HRESULT(STDMETHODCALLTYPE* RegisterStereoStatusEvent)(
|
||||
IDXGIFactory6* This,
|
||||
HANDLE hEvent,
|
||||
DWORD* pdwCookie);
|
||||
|
||||
void (STDMETHODCALLTYPE* UnregisterStereoStatus)(
|
||||
IDXGIFactory6* This,
|
||||
DWORD dwCookie);
|
||||
|
||||
HRESULT(STDMETHODCALLTYPE* RegisterOcclusionStatusWindow)(
|
||||
IDXGIFactory6* This,
|
||||
HWND WindowHandle,
|
||||
UINT wMsg,
|
||||
DWORD* pdwCookie);
|
||||
|
||||
HRESULT(STDMETHODCALLTYPE* RegisterOcclusionStatusEvent)(
|
||||
IDXGIFactory6* This,
|
||||
HANDLE hEvent,
|
||||
DWORD* pdwCookie);
|
||||
|
||||
void (STDMETHODCALLTYPE* UnregisterOcclusionStatus)(
|
||||
IDXGIFactory6* This,
|
||||
DWORD dwCookie);
|
||||
|
||||
HRESULT(STDMETHODCALLTYPE* CreateSwapChainForComposition)(
|
||||
IDXGIFactory6* This,
|
||||
IUnknown* pDevice,
|
||||
void* pDesc,
|
||||
void* pRestrictToOutput,
|
||||
void** ppSwapChain);
|
||||
|
||||
UINT(STDMETHODCALLTYPE* GetCreationFlags)(
|
||||
IDXGIFactory6* This);
|
||||
|
||||
HRESULT(STDMETHODCALLTYPE* EnumAdapterByLuid)(
|
||||
IDXGIFactory6* This,
|
||||
LUID AdapterLuid,
|
||||
REFIID riid,
|
||||
void** ppvAdapter);
|
||||
|
||||
HRESULT(STDMETHODCALLTYPE* EnumWarpAdapter)(
|
||||
IDXGIFactory6* This,
|
||||
REFIID riid,
|
||||
void** ppvAdapter);
|
||||
|
||||
HRESULT(STDMETHODCALLTYPE* CheckFeatureSupport)(
|
||||
IDXGIFactory6* This,
|
||||
DXGI_FEATURE Feature,
|
||||
void* pFeatureSupportData,
|
||||
UINT FeatureSupportDataSize);
|
||||
|
||||
HRESULT(STDMETHODCALLTYPE* EnumAdapterByGpuPreference)(
|
||||
IDXGIFactory6* This,
|
||||
UINT Adapter,
|
||||
DXGI_GPU_PREFERENCE GpuPreference,
|
||||
REFIID riid,
|
||||
void** ppvAdapter);
|
||||
} IDXGIFactory6Vtbl;
|
||||
|
||||
struct IDXGIFactory6
|
||||
{
|
||||
struct IDXGIFactory6Vtbl* lpVtbl;
|
||||
};
|
||||
|
||||
#define IDXGIFactory6_EnumAdapterByGpuPreference(This,Adapter,GpuPreference,riid,ppvAdapter) \
|
||||
( (This)->lpVtbl -> EnumAdapterByGpuPreference(This,Adapter,GpuPreference,riid,ppvAdapter) )
|
||||
static const IID D3D_IID_ID3D11Device1 = { 0xa04bfb29,0x08ef,0x43d6,{0xa4,0x9c,0xa9,0xbd,0xbd,0xcb,0xe6,0x86} };
|
||||
|
|
Loading…
Reference in New Issue