This commit is contained in:
jacob 2026-03-10 16:34:36 -05:00
parent ac967161a2
commit 8d051b0324
5 changed files with 346 additions and 260 deletions

View File

@ -50,7 +50,7 @@ Struct(LogEventsArray)
#if LogLevel(LogLevel_Critical) #if LogLevel(LogLevel_Critical)
#define LogCritical(msg) Log_(LogLevel_Critical, msg) #define LogCritical(msg) Log_(LogLevel_Critical, msg)
#define LogCriticalF(fmt_lit, ...) LogF_(LogLevel_Critical, Lit(fmt_lit) , ## __VA_ARGS__, FmtEnd) #define LogCriticalF(fmt_lit, ...) LogF_(LogLevel_Critical, Lit(fmt_lit) , ##__VA_ARGS__, FmtEnd)
#else #else
#define LogCritical(msg) #define LogCritical(msg)
#define LogCriticalF(...) #define LogCriticalF(...)
@ -58,7 +58,7 @@ Struct(LogEventsArray)
#if LogLevel(LogLevel_Error) #if LogLevel(LogLevel_Error)
#define LogError(msg) Log_(LogLevel_Error, msg) #define LogError(msg) Log_(LogLevel_Error, msg)
#define LogErrorF(fmt_lit, ...) LogF_(LogLevel_Error, Lit(fmt_lit) , ## __VA_ARGS__, FmtEnd) #define LogErrorF(fmt_lit, ...) LogF_(LogLevel_Error, Lit(fmt_lit) , ##__VA_ARGS__, FmtEnd)
#else #else
#define LogError(msg) #define LogError(msg)
#define LogErrorF(...) #define LogErrorF(...)
@ -66,7 +66,7 @@ Struct(LogEventsArray)
#if LogLevel(LogLevel_Warning) #if LogLevel(LogLevel_Warning)
#define LogWarning(msg) Log_(LogLevel_Warning, msg) #define LogWarning(msg) Log_(LogLevel_Warning, msg)
#define LogWarningF(fmt_lit, ...) LogF_(LogLevel_Warning, Lit(fmt_lit) , ## __VA_ARGS__, FmtEnd) #define LogWarningF(fmt_lit, ...) LogF_(LogLevel_Warning, Lit(fmt_lit) , ##__VA_ARGS__, FmtEnd)
#else #else
#define LogWarning(msg) #define LogWarning(msg)
#define LogWarningF(...) #define LogWarningF(...)
@ -74,7 +74,7 @@ Struct(LogEventsArray)
#if LogLevel(LogLevel_Success) #if LogLevel(LogLevel_Success)
#define LogSuccess(msg) Log_(LogLevel_Success, msg) #define LogSuccess(msg) Log_(LogLevel_Success, msg)
#define LogSuccessF(fmt_lit, ...) LogF_(LogLevel_Success, Lit(fmt_lit) , ## __VA_ARGS__, FmtEnd) #define LogSuccessF(fmt_lit, ...) LogF_(LogLevel_Success, Lit(fmt_lit) , ##__VA_ARGS__, FmtEnd)
#else #else
#define LogSuccess(msg) #define LogSuccess(msg)
#define LogSuccessF(...) #define LogSuccessF(...)
@ -82,7 +82,7 @@ Struct(LogEventsArray)
#if LogLevel(LogLevel_Info) #if LogLevel(LogLevel_Info)
#define LogInfo(msg) Log_(LogLevel_Info, msg) #define LogInfo(msg) Log_(LogLevel_Info, msg)
#define LogInfoF(fmt_lit, ...) LogF_(LogLevel_Info, Lit(fmt_lit) , ## __VA_ARGS__, FmtEnd) #define LogInfoF(fmt_lit, ...) LogF_(LogLevel_Info, Lit(fmt_lit) , ##__VA_ARGS__, FmtEnd)
#else #else
#define LogInfo(msg) #define LogInfo(msg)
#define LogInfoF(...) #define LogInfoF(...)
@ -90,7 +90,7 @@ Struct(LogEventsArray)
#if LogLevel(LogLevel_Debug) #if LogLevel(LogLevel_Debug)
#define LogDebug(msg) Log_(LogLevel_Debug, msg) #define LogDebug(msg) Log_(LogLevel_Debug, msg)
#define LogDebugF(fmt_lit, ...) LogF_(LogLevel_Debug, Lit(fmt_lit) , ## __VA_ARGS__, FmtEnd) #define LogDebugF(fmt_lit, ...) LogF_(LogLevel_Debug, Lit(fmt_lit) , ##__VA_ARGS__, FmtEnd)
#else #else
#define LogDebug(msg) #define LogDebug(msg)
#define LogDebugF(...) #define LogDebugF(...)
@ -98,7 +98,7 @@ Struct(LogEventsArray)
#if LogLevel(LogLevel_Trace) #if LogLevel(LogLevel_Trace)
#define LogTrace(msg) Log_(LogLevel_Trace, msg) #define LogTrace(msg) Log_(LogLevel_Trace, msg)
#define LogTraceF(fmt_lit, ...) LogF_(LogLevel_Trace, Lit(fmt_lit) , ## __VA_ARGS__, FmtEnd) #define LogTraceF(fmt_lit, ...) LogF_(LogLevel_Trace, Lit(fmt_lit) , ##__VA_ARGS__, FmtEnd)
#else #else
#define LogTrace(msg) #define LogTrace(msg)
#define LogTraceF(...) #define LogTraceF(...)

View File

@ -3,7 +3,6 @@
Struct(G_ArenaHandle) { u64 v; }; Struct(G_ArenaHandle) { u64 v; };
Struct(G_CommandListHandle) { u64 v; }; Struct(G_CommandListHandle) { u64 v; };
Struct(G_ResourceHandle) { u64 v; };
Struct(G_SwapchainHandle) { u64 v; }; Struct(G_SwapchainHandle) { u64 v; };
#define G_IsArenaNil(h) ((h).v == 0) #define G_IsArenaNil(h) ((h).v == 0)
@ -16,11 +15,11 @@ Struct(G_SwapchainHandle) { u64 v; };
#define G_IsMultiQueueEnabled 1 #define G_IsMultiQueueEnabled 1
Enum(G_QueueFamily) Enum(G_Family)
{ {
G_QueueFamily_Graphics, G_Family_Graphics,
G_QueueFamily_Compute, G_Family_Compute,
G_QueueFamily_Copy G_Family_Copy
}; };
Enum(G_QueueKind) Enum(G_QueueKind)
@ -382,16 +381,9 @@ Enum(G_BlendMode)
G_BlendMode_CompositePremultipliedAlpha, G_BlendMode_CompositePremultipliedAlpha,
}; };
Struct(G_IndexBufferDesc)
{
u32 count;
u32 stride; // Either 2 for u16 indices, or 4 for u32 indices
G_ResourceHandle resource;
};
Struct(G_RenderTargetDesc) Struct(G_RenderTargetDesc)
{ {
G_ResourceHandle resource; G_TextureRef texture;
G_BlendMode blend; G_BlendMode blend;
i32 mip; i32 mip;
}; };
@ -427,7 +419,7 @@ void G_ResetArena(G_CommandListHandle cl_handle, G_ArenaHandle arena_handle);
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
//~ @hookdecl Memory //~ @hookdecl Memory
G_BaseDescriptorIndex G_PushMemory(G_CommandListHandle cl, G_ArenaHandle gpu_arena, G_MemoryDesc desc); G_BaseDescriptorIndex G_PushMemory(G_CommandListHandle cl, G_ArenaHandle gpu_arena, G_MemoryDesc memory_desc);
#define G_PushBuffer(_cl, _arena, _type, _count, ...) ((G_BufferRef) { .v = G_PushMemory((_cl), (_arena), \ #define G_PushBuffer(_cl, _arena, _type, _count, ...) ((G_BufferRef) { .v = G_PushMemory((_cl), (_arena), \
(G_MemoryDesc) { \ (G_MemoryDesc) { \
@ -575,6 +567,7 @@ G_BaseDescriptorIndex G_PushMemory(G_CommandListHandle cl, G_ArenaHandle gpu_are
//- Count //- Count
u64 G_GetStride(G_BufferRef buffer);
u64 G_CountBuffer(G_BufferRef buffer); u64 G_CountBuffer(G_BufferRef buffer);
u64 G_CountBufferBytes(G_BufferRef buffer); u64 G_CountBufferBytes(G_BufferRef buffer);
i32 G_Count1D(G_TextureRef texture); i32 G_Count1D(G_TextureRef texture);
@ -587,8 +580,8 @@ i32 G_CountMips(G_TextureRef texture);
//- Map //- Map
void *G_CpuAddressFromBuffer(G_BufferRef buffer); void *G_CpuPointerFromBuffer(G_BufferRef buffer);
#define G_StructFromBuffer(buffer, type) (type *)G_CpuAddressFromBuffer(buffer) #define G_Deref(buffer, type) ((type *)G_CpuPointerFromBuffer(buffer))
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
//~ @hookdecl Shader resource reference //~ @hookdecl Shader resource reference
@ -650,7 +643,7 @@ i64 G_CommitCommandList(G_CommandListHandle cl);
void G_SetConstantEx(G_CommandListHandle cl, i32 slot, void *src_32bit, u32 size); void G_SetConstantEx(G_CommandListHandle cl, i32 slot, void *src_32bit, u32 size);
#define G_SetConstant(cl, name, value) do { \ #define G_SetConstant(cl, name, value) do { \
CAT(name, __shaderconstanttype) __src; \ CAT(__ShaderConstantType_,name) __src; \
__src.v = value; \ __src.v = value; \
G_SetConstantEx((cl), (name), &__src, sizeof(__src)); \ G_SetConstantEx((cl), (name), &__src, sizeof(__src)); \
} while (0) } while (0)
@ -694,7 +687,7 @@ void G_ComputeEx(G_CommandListHandle cl, ComputeShaderDesc cs, Vec3I32 threads);
void G_Draw( void G_Draw(
G_CommandListHandle cl, G_CommandListHandle cl,
VertexShaderDesc vs, PixelShaderDesc ps, VertexShaderDesc vs, PixelShaderDesc ps,
u32 instances_count, G_IndexBufferDesc index_buffer, u32 instances_count, G_BufferRef indices,
u32 render_targets_count, G_RenderTargetDesc *render_targets, u32 render_targets_count, G_RenderTargetDesc *render_targets,
Rng3 viewport, Rng2 scissor, Rng3 viewport, Rng2 scissor,
G_DrawMode draw_mode G_DrawMode draw_mode
@ -702,7 +695,7 @@ void G_Draw(
//- Clear //- Clear
void G_ClearRenderTarget(G_CommandListHandle cl, G_TextureRef render_target, Vec4 color, i32 mip); void G_ClearRenderTarget(G_CommandListHandle cl, G_TextureRef texture, Vec4 color, i32 mip);
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
//~ @hookdecl Queue synchronization //~ @hookdecl Queue synchronization

View File

@ -484,18 +484,14 @@ void G_Bootstrap(void)
ID3D12DescriptorHeap_GetCPUDescriptorHandleForHeapStart(heap->d3d_heap, &heap->start_handle); ID3D12DescriptorHeap_GetCPUDescriptorHandleForHeapStart(heap->d3d_heap, &heap->start_handle);
} }
// Push nil descriptor at index 0
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
{ {
G_D12_DescriptorDesc descriptor_desc = Zi; // Push nil descriptor at index 0
descriptor_desc.resource = 0; {
descriptor_desc.bundle_count = G_D12_MaxDescriptorBundleCount; G_D12_Arena *gpu_perm = G_D12_ArenaFromHandle(G_PermArena());
G_D12_Descriptor *nil_descriptor = G_D12_PushDescriptor(gpu_perm, 1, heap_kind);
// Push an empty descriptor at index 0, so that a handle with a value of 0 always represents nil Assert(nil_descriptor->base_index == 0);
G_D12_Arena *gpu_perm = G_D12_ArenaFromHandle(G_PermArena()); }
G_D12_Descriptor *nil_descriptor = G_D12_PushDescriptor(gpu_perm, descriptor_desc, heap_kind);
Assert(nil_descriptor->base_index == 0);
G_D12_SetObjectName((ID3D12Object *)heap->d3d_heap, desc.name); G_D12_SetObjectName((ID3D12Object *)heap->d3d_heap, desc.name);
} }
@ -628,11 +624,6 @@ G_D12_CmdList *G_D12_CmdListFromHandle(G_CommandListHandle handle)
return (G_D12_CmdList *)handle.v; return (G_D12_CmdList *)handle.v;
} }
G_D12_Resource *G_D12_ResourceFromHandle(G_ResourceHandle handle)
{
return (G_D12_Resource *)handle.v;
}
G_D12_Swapchain *G_D12_SwapchainFromHandle(G_SwapchainHandle handle) G_D12_Swapchain *G_D12_SwapchainFromHandle(G_SwapchainHandle handle)
{ {
return (G_D12_Swapchain *)handle.v; return (G_D12_Swapchain *)handle.v;
@ -657,35 +648,6 @@ D3D12_BARRIER_LAYOUT G_D12_CommonLayoutFromQueueKind(G_QueueKind queue_kind)
return result; return result;
} }
void G_D12_InitRtv(G_D12_Resource *resource, D3D12_CPU_DESCRIPTOR_HANDLE rtv_handle, i32 mip)
{
DXGI_FORMAT format = G_D12_DxgiFormatFromGpuFormat(resource->texture_format);
D3D12_RESOURCE_DESC res_d3d_desc = Zi;
{
ID3D12Resource_GetDesc(resource->d3d_resource, &res_d3d_desc);
}
D3D12_RENDER_TARGET_VIEW_DESC rtv_desc = Zi;
{
rtv_desc.Format = res_d3d_desc.Format;
if (res_d3d_desc.Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE1D)
{
rtv_desc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE1D;
rtv_desc.Texture1D.MipSlice = mip;
}
else if (res_d3d_desc.Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE2D)
{
rtv_desc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2D;
rtv_desc.Texture2D.MipSlice = mip;
}
else if (res_d3d_desc.Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE3D)
{
rtv_desc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE3D;
rtv_desc.Texture3D.MipSlice = mip;
}
}
ID3D12Device_CreateRenderTargetView(G_D12.device, resource->d3d_resource, &rtv_desc, rtv_handle);
}
void G_D12_SetObjectName(ID3D12Object *object, String name) void G_D12_SetObjectName(ID3D12Object *object, String name)
{ {
TempArena scratch = BeginScratchNoConflict(); TempArena scratch = BeginScratchNoConflict();
@ -1051,9 +1013,9 @@ G_D12_RawCommandList *G_D12_PrepareRawCommandList(G_QueueKind queue_kind)
G_D12_Arena *gpu_perm = G_D12_ArenaFromHandle(G_PermArena()); G_D12_Arena *gpu_perm = G_D12_ArenaFromHandle(G_PermArena());
for (u32 rtv_idx = 0; rtv_idx < countof(cl->rtv_descriptors); ++rtv_idx) for (u32 rtv_idx = 0; rtv_idx < countof(cl->rtv_descriptors); ++rtv_idx)
{ {
cl->rtv_descriptors[rtv_idx] = G_D12_PushDescriptor(gpu_perm, G_D12_DescriptorHeapKind_Rtv); cl->rtv_descriptors[rtv_idx] = G_D12_PushDescriptor(gpu_perm, 1, G_D12_DescriptorHeapKind_Rtv);
} }
cl->rtv_clear_descriptor = G_D12_PushDescriptor(gpu_perm, G_D12_DescriptorHeapKind_Rtv); cl->rtv_clear_descriptor = G_D12_PushDescriptor(gpu_perm, 1, G_D12_DescriptorHeapKind_Rtv);
} }
} }
@ -1289,13 +1251,104 @@ void G_D12_ResetArena(G_D12_CmdList *cl, G_D12_Arena *gpu_arena)
G_D12_Descriptor *G_D12_PushDescriptor(G_D12_Arena *gpu_arena, G_D12_DescriptorDesc desc, G_D12_DescriptorHeapKind heap_kind)
// void G_D12_InitRtv(G_D12_Resource *resource, D3D12_CPU_DESCRIPTOR_HANDLE rtv_handle, i32 mip)
// {
// DXGI_FORMAT format = G_D12_DxgiFormatFromGpuFormat(resource->texture_format);
// D3D12_RESOURCE_DESC res_d3d_desc = Zi;
// {
// ID3D12Resource_GetDesc(resource->d3d_resource, &res_d3d_desc);
// }
// D3D12_RENDER_TARGET_VIEW_DESC rtv_desc = Zi;
// {
// rtv_desc.Format = res_d3d_desc.Format;
// if (res_d3d_desc.Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE1D)
// {
// rtv_desc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE1D;
// rtv_desc.Texture1D.MipSlice = mip;
// }
// else if (res_d3d_desc.Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE2D)
// {
// rtv_desc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2D;
// rtv_desc.Texture2D.MipSlice = mip;
// }
// else if (res_d3d_desc.Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE3D)
// {
// rtv_desc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE3D;
// rtv_desc.Texture3D.MipSlice = mip;
// }
// }
// ID3D12Device_CreateRenderTargetView(G_D12.device, resource->d3d_resource, &rtv_desc, rtv_handle);
// }
// FIXME: Header
G_D12_Descriptor *G_D12_PushDescriptor(G_D12_Arena *gpu_arena, u64 bundle_count, G_D12_DescriptorHeapKind heap_kind)
{ {
// FIXME: Impl // FIXME: Impl
G_D12_Descriptor result = 0; G_D12_Descriptor *result = 0;
return result; return result;
} }
void G_D12_InitRtvDescriptorFromResource(G_D12_Descriptor *descriptor, G_D12_Resource *resource, i32 mip)
{
// FIXME: Impl
}
G_D12_Descriptor *G_D12_DescriptorFromBufferRef(G_BufferRef ref)
{
// FIXME: Impl
G_D12_Descriptor *result = 0;
return result;
}
G_D12_Descriptor *G_D12_DescriptorFromTextureRef(G_TextureRef ref)
{
G_D12_Descriptor *result = 0;
return result;
}
G_D12_Descriptor *G_D12_DescriptorFromSamplerRef(G_SamplerRef ref)
{
G_D12_Descriptor *result = 0;
return result;
}
G_D12_Resource *G_D12_ResourceFromBufferRef(G_BufferRef ref)
{
return G_D12_DescriptorFromBufferRef(ref)->resource;
}
G_D12_Resource *G_D12_ResourceFromTextureRef(G_TextureRef ref)
{
return G_D12_DescriptorFromTextureRef(ref)->resource;
}
G_D12_Resource *G_D12_ResourceFromSamplerRef(G_SamplerRef ref)
{
return G_D12_DescriptorFromSamplerRef(ref)->resource;
}
@ -1321,7 +1374,7 @@ G_D12_Descriptor *G_D12_PushDescriptor(G_D12_Arena *gpu_arena, G_D12_DescriptorD
G_BaseDescriptorIndex G_PushMemory(G_CommandListHandle cl_handle, G_ArenaHandle gpu_arena_handle, G_MemoryDesc memory_dsec) G_BaseDescriptorIndex G_PushMemory(G_CommandListHandle cl_handle, G_ArenaHandle gpu_arena_handle, G_MemoryDesc memory_desc)
{ {
Arena *perm = PermArena(); Arena *perm = PermArena();
G_D12_Arena *gpu_arena = G_D12_ArenaFromHandle(gpu_arena_handle); G_D12_Arena *gpu_arena = G_D12_ArenaFromHandle(gpu_arena_handle);
@ -1329,22 +1382,22 @@ G_BaseDescriptorIndex G_PushMemory(G_CommandListHandle cl_handle, G_ArenaHandle
G_QueueKind queue_kind = cl->queue_kind; G_QueueKind queue_kind = cl->queue_kind;
G_D12_Resource *resource = 0; G_D12_Resource *resource = 0;
b32 is_buffer = desc.kind == G_MemoryKind_Buffer; b32 is_buffer = memory_desc.kind == G_MemoryKind_Buffer;
b32 is_texture = ( b32 is_texture = (
desc.kind == G_MemoryKind_Texture1D || memory_desc.kind == G_MemoryKind_Texture1D ||
desc.kind == G_MemoryKind_Texture2D || memory_desc.kind == G_MemoryKind_Texture2D ||
desc.kind == G_MemoryKind_Texture3D memory_desc.kind == G_MemoryKind_Texture3D
); );
b32 is_sampler = desc.kind == G_MemoryKind_Sampler; b32 is_sampler = memory_desc.kind == G_MemoryKind_Sampler;
G_MemoryFlag flags = ( G_MemoryFlag flags = (
is_buffer ? desc.buffer.flags : is_buffer ? memory_desc.buffer.flags :
is_texture ? desc.texture.flags : is_texture ? memory_desc.texture.flags :
desc.sampler.flags memory_desc.sampler.flags
); );
String new_name = ( String new_name = (
is_buffer ? desc.buffer.name : is_buffer ? memory_desc.buffer.name :
is_texture ? desc.texture.name : is_texture ? memory_desc.texture.name :
desc.sampler.name memory_desc.sampler.name
); );
new_name.len = MinU64(new_name.len, G_D12_MaxNameLen); new_name.len = MinU64(new_name.len, G_D12_MaxNameLen);
@ -1360,15 +1413,15 @@ G_BaseDescriptorIndex G_PushMemory(G_CommandListHandle cl_handle, G_ArenaHandle
{ {
G_D12_ResourceHeapKind heap_kind = G_D12_ResourceHeapKind_Gpu; G_D12_ResourceHeapKind heap_kind = G_D12_ResourceHeapKind_Gpu;
// Heap flags // Heap flags
if (flags & G_MemoryFlag_HostMemory) if (flags & G_MemoryFlag_HostCached)
{ {
heap_kind = G_D12_ResourceHeapKind_Cpu; heap_kind = G_D12_ResourceHeapKind_CpuWriteBack;
if (flags & G_MemoryFlag_Uncached)
{
heap_kind = G_D12_ResourceHeapKind_CpuWriteCombined;
}
} }
if (flags & G_MemoryFlag_ZeroMemory) else if (flags & G_MemoryFlag_HostUncached)
{
heap_kind = G_D12_ResourceHeapKind_CpuWriteCombined;
}
if (flags & G_MemoryFlag_Zero)
{ {
can_reuse = 0; can_reuse = 0;
} }
@ -1377,7 +1430,7 @@ G_BaseDescriptorIndex G_PushMemory(G_CommandListHandle cl_handle, G_ArenaHandle
heap_flags |= D3D12_HEAP_FLAG_CREATE_NOT_ZEROED; heap_flags |= D3D12_HEAP_FLAG_CREATE_NOT_ZEROED;
} }
// Heap props // Heap props
if (heap_kind == G_D12_ResourceHeapKind_Cpu) if (heap_kind == G_D12_ResourceHeapKind_CpuWriteBack)
{ {
heap_props.Type = D3D12_HEAP_TYPE_CUSTOM; heap_props.Type = D3D12_HEAP_TYPE_CUSTOM;
heap_props.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_WRITE_BACK; heap_props.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_WRITE_BACK;
@ -1402,45 +1455,47 @@ G_BaseDescriptorIndex G_PushMemory(G_CommandListHandle cl_handle, G_ArenaHandle
D3D12_CLEAR_VALUE clear_value = Zi; D3D12_CLEAR_VALUE clear_value = Zi;
D3D12_RESOURCE_DESC1 d3d_desc = Zi; D3D12_RESOURCE_DESC1 d3d_desc = Zi;
u64 buffer_size = 0;
if (is_buffer) if (is_buffer)
{ {
u64 min_buffer_size = 1024; u64 min_buffer_size = 1024;
buffer_size = NextPow2U64(MaxU64(memory_desc.buffer.count * memory_desc.buffer.stride, min_buffer_size));
d3d_desc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER; d3d_desc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER;
d3d_desc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR; d3d_desc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR;
d3d_desc.Format = DXGI_FORMAT_UNKNOWN; d3d_desc.Format = DXGI_FORMAT_UNKNOWN;
d3d_desc.Width = NextPow2U64(MaxU64(desc.buffer.size, min_buffer_size)); d3d_desc.Width = buffer_size;
d3d_desc.Height = 1; d3d_desc.Height = 1;
d3d_desc.DepthOrArraySize = 1; d3d_desc.DepthOrArraySize = 1;
d3d_desc.MipLevels = 1; d3d_desc.MipLevels = 1;
d3d_desc.SampleDesc.Count = 1; d3d_desc.SampleDesc.Count = 1;
d3d_desc.SampleDesc.Quality = 0; d3d_desc.SampleDesc.Quality = 0;
d3d_desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS * AnyBit(flags, G_MemoryFlag_AllowShaderReadWrite); d3d_desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS;
} }
else if (is_texture) else if (is_texture)
{ {
i32 largest_dim = MaxI32(MaxI32(desc.texture.dims.x, desc.texture.dims.y), desc.texture.dims.z); i32 largest_dim = MaxI32(MaxI32(memory_desc.texture.dims.x, memory_desc.texture.dims.y), memory_desc.texture.dims.z);
i32 max_mips = MinI32(FloorF32(Log2F32(largest_dim)) + 1, G_MaxMips); i32 max_mips = MinI32(FloorF32(Log2F32(largest_dim)) + 1, G_MaxMips);
d3d_desc.Dimension = ( d3d_desc.Dimension = (
desc.kind == G_MemoryKind_Texture1D ? D3D12_RESOURCE_DIMENSION_TEXTURE1D : memory_desc.kind == G_MemoryKind_Texture1D ? D3D12_RESOURCE_DIMENSION_TEXTURE1D :
desc.kind == G_MemoryKind_Texture2D ? D3D12_RESOURCE_DIMENSION_TEXTURE2D : memory_desc.kind == G_MemoryKind_Texture2D ? D3D12_RESOURCE_DIMENSION_TEXTURE2D :
D3D12_RESOURCE_DIMENSION_TEXTURE3D D3D12_RESOURCE_DIMENSION_TEXTURE3D
); );
d3d_desc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN; d3d_desc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN;
d3d_desc.Format = G_D12_DxgiFormatFromGpuFormat(desc.texture.format); d3d_desc.Format = G_D12_DxgiFormatFromGpuFormat(memory_desc.texture.format);
d3d_desc.Width = MaxI32(desc.texture.dims.x, 1); d3d_desc.Width = MaxI32(memory_desc.texture.dims.x, 1);
d3d_desc.Height = MaxI32(desc.texture.dims.y, 1); d3d_desc.Height = MaxI32(memory_desc.texture.dims.y, 1);
d3d_desc.DepthOrArraySize = MaxI32(desc.texture.dims.z, 1); d3d_desc.DepthOrArraySize = MaxI32(memory_desc.texture.dims.z, 1);
d3d_desc.MipLevels = ClampF32(desc.texture.max_mips, 1, max_mips); d3d_desc.MipLevels = ClampF32(memory_desc.texture.max_mips, 1, max_mips);
d3d_desc.SampleDesc.Count = 1; d3d_desc.SampleDesc.Count = 1;
d3d_desc.SampleDesc.Quality = 0; d3d_desc.SampleDesc.Quality = 0;
d3d_desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS * AnyBit(flags, G_MemoryFlag_AllowShaderReadWrite); d3d_desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS * AnyBit(flags, G_MemoryFlag_AllowTextureRW);
d3d_desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET * AnyBit(flags, G_MemoryFlag_AllowRenderTarget); d3d_desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET * AnyBit(flags, G_MemoryFlag_AllowTextureDraw);
d3d_desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL * AnyBit(flags, G_MemoryFlag_AllowTextureDepthStencil); d3d_desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL * AnyBit(flags, G_MemoryFlag_AllowTextureDepthStencil);
d3d_desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_SIMULTANEOUS_ACCESS * (desc.texture.initial_layout == G_Layout_Simultaneous); d3d_desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_SIMULTANEOUS_ACCESS * (memory_desc.texture.initial_layout == G_TextureLayout_Simultaneous);
clear_value.Color[0] = desc.texture.clear_color.x, clear_value.Color[0] = memory_desc.texture.clear_color.x,
clear_value.Color[1] = desc.texture.clear_color.y, clear_value.Color[1] = memory_desc.texture.clear_color.y,
clear_value.Color[2] = desc.texture.clear_color.z, clear_value.Color[2] = memory_desc.texture.clear_color.z,
clear_value.Color[3] = desc.texture.clear_color.w, clear_value.Color[3] = memory_desc.texture.clear_color.w,
clear_value.Format = d3d_desc.Format; clear_value.Format = d3d_desc.Format;
} }
@ -1513,23 +1568,17 @@ G_BaseDescriptorIndex G_PushMemory(G_CommandListHandle cl_handle, G_ArenaHandle
resource->flags = flags; resource->flags = flags;
if (is_buffer)
{
resource->buffer_size = desc.buffer.size;
resource->buffer_size_actual = d3d_desc.Width;
}
if (is_texture) if (is_texture)
{ {
resource->is_texture = is_texture; resource->is_texture = 1;
resource->texture_format = desc.texture.format; resource->texture_format = memory_desc.texture.format;
resource->texture_dims = desc.texture.dims; resource->texture_dims = memory_desc.texture.dims;
resource->texture_mips = d3d_desc.MipLevels; resource->texture_mips = d3d_desc.MipLevels;
} }
if (is_sampler) if (is_sampler)
{ {
resource->sampler_desc = desc.sampler; resource->sampler_desc = memory_desc.sampler;
} }
DllQueuePush(gpu_arena->resources.first, gpu_arena->resources.last, resource); DllQueuePush(gpu_arena->resources.first, gpu_arena->resources.last, resource);
@ -1550,7 +1599,7 @@ G_BaseDescriptorIndex G_PushMemory(G_CommandListHandle cl_handle, G_ArenaHandle
if (is_texture) if (is_texture)
{ {
d3d_initial_layout = D3D12_BARRIER_LAYOUT_COMMON; d3d_initial_layout = D3D12_BARRIER_LAYOUT_COMMON;
if (desc.texture.initial_layout == G_Layout_Exclusive) if (memory_desc.texture.initial_layout == G_TextureLayout_Family)
{ {
switch (queue_kind) switch (queue_kind)
{ {
@ -1578,7 +1627,7 @@ G_BaseDescriptorIndex G_PushMemory(G_CommandListHandle cl_handle, G_ArenaHandle
// Queue initial Rtv/Dsv discard // Queue initial Rtv/Dsv discard
if ( if (
!AnyBit(flags, G_MemoryFlag_ZeroMemory) && !AnyBit(flags, G_MemoryFlag_Zero) &&
AnyBit(d3d_desc.Flags, D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET | D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL) AnyBit(d3d_desc.Flags, D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET | D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL)
) )
{ {
@ -1627,41 +1676,62 @@ G_BaseDescriptorIndex G_PushMemory(G_CommandListHandle cl_handle, G_ArenaHandle
} }
////////////////////////////// //////////////////////////////
//- Transition reused resources to common //- Push ref
G_BaseDescriptorIndex result = 0;
// G_D12_RefBundle *bundle = 0;
// {
// G_D12_RefBundleDesc memory_desc = Zi;
// memory_desc.resource = resource;
// if (is_buffer)
// {
// memory_desc.buffer_element_offset = 0;
// memory_desc.buffer_element_count = memory_desc.buffer.count;
// memory_desc.buffer_element_stride = memory_desc.buffer.stride;
// }
// else if (is_texture)
// {
// memory_desc.mips = RngI32(0, resource->texture_mips);
// }
// bundle = G_D12_PushRefBundle(cl, gpu_arena, memory_desc);
// }
//////////////////////////////
//- Transition reused texture to common if necessary
// FIXME: On reset, transition resources to UNDEFINED + No access
// Then here, transition from undefined (w/ discard if rt/dsv)
G_ResourceHandle resource_handle = G_D12_MakeHandle(G_ResourceHandle, resource);
if ( if (
is_texture &&
can_reuse && can_reuse &&
desc.texture.initial_layout == G_Layout_Common && memory_desc.texture.initial_layout == G_TextureLayout_Common &&
queue_kind != G_QueueKind_AsyncCopy queue_kind != G_QueueKind_AsyncCopy
) )
{ {
G_SyncLayout(cl_handle, resource_handle, G_Layout_Common);
}
////////////////////////////// G_SyncLayout(cl_handle, G_MakeTextureRef(result), G_TextureLayout_Common);
//- Push ref
G_D12_RefBundle *bundle = 0;
{
G_D12_RefBundleDesc desc = Zi;
desc.resource = resource;
if (is_buffer)
{
desc.buffer_element_offset = 0;
desc.buffer_element_count = desc.buffer.count;
desc.buffer_element_stride = desc.buffer.stride;
}
else if (is_texture)
{
desc.mips = RngI32(0, resource->texture_mips);
}
bundle = G_D12_PushRefBundle(cl, gpu_arena, desc);
} }
return bundle->base_index;
return result;
} }
@ -1715,13 +1785,13 @@ G_BaseDescriptorIndex G_PushMemory(G_CommandListHandle cl_handle, G_ArenaHandle
// // Heap flags // // Heap flags
// if (flags & G_MemoryFlag_HostMemory) // if (flags & G_MemoryFlag_HostMemory)
// { // {
// heap_kind = G_D12_ResourceHeapKind_Cpu; // heap_kind = G_D12_ResourceHeapKind_CpuWriteBack;
// if (flags & G_MemoryFlag_Uncached) // if (flags & G_MemoryFlag_Uncached)
// { // {
// heap_kind = G_D12_ResourceHeapKind_CpuWriteCombined; // heap_kind = G_D12_ResourceHeapKind_CpuWriteCombined;
// } // }
// } // }
// if (flags & G_MemoryFlag_ZeroMemory) // if (flags & G_MemoryFlag_Zero)
// { // {
// can_reuse = 0; // can_reuse = 0;
// } // }
@ -1730,7 +1800,7 @@ G_BaseDescriptorIndex G_PushMemory(G_CommandListHandle cl_handle, G_ArenaHandle
// heap_flags |= D3D12_HEAP_FLAG_CREATE_NOT_ZEROED; // heap_flags |= D3D12_HEAP_FLAG_CREATE_NOT_ZEROED;
// } // }
// // Heap props // // Heap props
// if (heap_kind == G_D12_ResourceHeapKind_Cpu) // if (heap_kind == G_D12_ResourceHeapKind_CpuWriteBack)
// { // {
// heap_props.Type = D3D12_HEAP_TYPE_CUSTOM; // heap_props.Type = D3D12_HEAP_TYPE_CUSTOM;
// heap_props.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_WRITE_BACK; // heap_props.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_WRITE_BACK;
@ -1789,7 +1859,7 @@ G_BaseDescriptorIndex G_PushMemory(G_CommandListHandle cl_handle, G_ArenaHandle
// d3d_desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS * AnyBit(flags, G_MemoryFlag_AllowShaderReadWrite); // d3d_desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS * AnyBit(flags, G_MemoryFlag_AllowShaderReadWrite);
// d3d_desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET * AnyBit(flags, G_MemoryFlag_AllowRenderTarget); // d3d_desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET * AnyBit(flags, G_MemoryFlag_AllowRenderTarget);
// d3d_desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL * AnyBit(flags, G_MemoryFlag_AllowTextureDepthStencil); // d3d_desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL * AnyBit(flags, G_MemoryFlag_AllowTextureDepthStencil);
// d3d_desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_SIMULTANEOUS_ACCESS * (desc.texture.initial_layout == G_Layout_Simultaneous); // d3d_desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_SIMULTANEOUS_ACCESS * (desc.texture.initial_layout == G_TextureLayout_Simultaneous);
// clear_value.Color[0] = desc.texture.clear_color.x, // clear_value.Color[0] = desc.texture.clear_color.x,
// clear_value.Color[1] = desc.texture.clear_color.y, // clear_value.Color[1] = desc.texture.clear_color.y,
// clear_value.Color[2] = desc.texture.clear_color.z, // clear_value.Color[2] = desc.texture.clear_color.z,
@ -1903,7 +1973,7 @@ G_BaseDescriptorIndex G_PushMemory(G_CommandListHandle cl_handle, G_ArenaHandle
// if (is_texture) // if (is_texture)
// { // {
// d3d_initial_layout = D3D12_BARRIER_LAYOUT_COMMON; // d3d_initial_layout = D3D12_BARRIER_LAYOUT_COMMON;
// if (desc.texture.initial_layout == G_Layout_Exclusive) // if (desc.texture.initial_layout == G_TextureLayout_Family)
// { // {
// switch (queue_kind) // switch (queue_kind)
// { // {
@ -1931,7 +2001,7 @@ G_BaseDescriptorIndex G_PushMemory(G_CommandListHandle cl_handle, G_ArenaHandle
// // Queue initial Rtv/Dsv discard // // Queue initial Rtv/Dsv discard
// if ( // if (
// !AnyBit(flags, G_MemoryFlag_ZeroMemory) && // !AnyBit(flags, G_MemoryFlag_Zero) &&
// AnyBit(d3d_desc.Flags, D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET | D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL) // AnyBit(d3d_desc.Flags, D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET | D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL)
// ) // )
// { // {
@ -1985,11 +2055,11 @@ G_BaseDescriptorIndex G_PushMemory(G_CommandListHandle cl_handle, G_ArenaHandle
// G_ResourceHandle resource_handle = G_D12_MakeHandle(G_ResourceHandle, resource); // G_ResourceHandle resource_handle = G_D12_MakeHandle(G_ResourceHandle, resource);
// if ( // if (
// can_reuse && // can_reuse &&
// desc.texture.initial_layout == G_Layout_Common && // desc.texture.initial_layout == G_TextureLayout_Common &&
// queue_kind != G_QueueKind_AsyncCopy // queue_kind != G_QueueKind_AsyncCopy
// ) // )
// { // {
// G_SyncLayout(cl_handle, resource_handle, G_Layout_Common); // G_SyncLayout(cl_handle, resource_handle, G_TextureLayout_Common);
// } // }
// return resource_handle; // return resource_handle;
@ -2210,6 +2280,13 @@ G_BaseDescriptorIndex G_PushMemory(G_CommandListHandle cl_handle, G_ArenaHandle
//- Count //- Count
u64 G_GetBufferStride(G_BufferRef buffer)
{
// FIXME: Impl
u64 result = Zi;
return result;
}
u64 G_CountBuffer(G_BufferRef buffer) u64 G_CountBuffer(G_BufferRef buffer)
{ {
// FIXME: Impl // FIXME: Impl
@ -2275,7 +2352,7 @@ i32 G_CountMips(G_TextureRef texture)
//- Map //- Map
void *G_CpuAddressFromBuffer(G_BufferRef buffer) void *G_CpuPointerFromBuffer(G_BufferRef buffer)
{ {
// FIXME: Impl // FIXME: Impl
void *result = 0; void *result = 0;
@ -2419,7 +2496,7 @@ G_D12_StagingRegionNode *G_D12_PushStagingRegion(G_D12_CmdList *cl, u64 size)
u8, new_ring_size, u8, new_ring_size,
.flags = G_MemoryFlag_HostUncached .flags = G_MemoryFlag_HostUncached
); );
ring->base = G_StructFromBuffer(ring->buffer, u8); ring->base = G_Deref(ring->buffer, u8);
} }
// Create initial region // Create initial region
@ -2827,7 +2904,7 @@ i64 G_CommitCommandList(G_CommandListHandle cl_handle)
for (u32 rt_idx = 0; rt_idx < G_MaxRenderTargets; ++rt_idx) for (u32 rt_idx = 0; rt_idx < G_MaxRenderTargets; ++rt_idx)
{ {
G_RenderTargetDesc *rt_desc = &cmd->draw.render_target_descs[rt_idx]; G_RenderTargetDesc *rt_desc = &cmd->draw.render_target_descs[rt_idx];
G_D12_Resource *resource = G_D12_ResourceFromHandle(rt_desc->resource); G_D12_Resource *resource = G_D12_ResourceFromTextureRef(rt_desc->texture);
if (resource) if (resource)
{ {
batch->contains_rtv = 1; batch->contains_rtv = 1;
@ -2876,7 +2953,7 @@ i64 G_CommitCommandList(G_CommandListHandle cl_handle)
DllQueuePush(first_batch, last_batch, batch); DllQueuePush(first_batch, last_batch, batch);
} }
G_D12_Resource *resource = cmd->barrier.resource; G_D12_Resource *resource = G_D12_ResourceFromTextureRef(cmd->barrier.texture);
if (resource) if (resource)
{ {
if (cmd->barrier.acquire) if (cmd->barrier.acquire)
@ -3266,7 +3343,7 @@ i64 G_CommitCommandList(G_CommandListHandle cl_handle)
for (u32 i = 0; i < countof(cmd->draw.render_target_descs); ++i) for (u32 i = 0; i < countof(cmd->draw.render_target_descs); ++i)
{ {
G_RenderTargetDesc desc = cmd->draw.render_target_descs[i]; G_RenderTargetDesc desc = cmd->draw.render_target_descs[i];
G_D12_Resource *rt = G_D12_ResourceFromHandle(desc.resource); G_D12_Resource *rt = G_D12_ResourceFromTextureRef(desc.texture);
if (rt) if (rt)
{ {
pipeline_desc.render_target_formats[i] = rt->texture_format; pipeline_desc.render_target_formats[i] = rt->texture_format;
@ -3281,27 +3358,27 @@ i64 G_CommitCommandList(G_CommandListHandle cl_handle)
} }
// Create ibv // Create ibv
u32 indices_count = 0; u32 indices_count = G_CountBuffer(cmd->draw.indices);
D3D12_INDEX_BUFFER_VIEW ibv = Zi; D3D12_INDEX_BUFFER_VIEW ibv = Zi;
{ {
G_IndexBufferDesc desc = cmd->draw.index_buffer_desc; if (indices_count > 0)
if (desc.count > 0)
{ {
G_D12_Resource *index_buffer_resource = G_D12_ResourceFromHandle(desc.resource); G_D12_Resource *indices_resource = G_D12_ResourceFromBufferRef(cmd->draw.indices);
ibv.BufferLocation = index_buffer_resource->buffer_gpu_address; u32 stride = G_GetStride(cmd->draw.indices);
ibv.SizeInBytes = desc.stride * desc.count; ibv.BufferLocation = indices_resource->buffer_gpu_address;
if (desc.stride == 2) ibv.SizeInBytes = indices_count * stride;
if (stride == 2)
{ {
ibv.Format = DXGI_FORMAT_R16_UINT; ibv.Format = DXGI_FORMAT_R16_UINT;
indices_count = ibv.SizeInBytes / 2;
} }
else if (desc.stride == 4) else if (stride == 4)
{ {
ibv.Format = DXGI_FORMAT_R32_UINT; ibv.Format = DXGI_FORMAT_R32_UINT;
indices_count = ibv.SizeInBytes / 4;
} }
else else
{ {
indices_count = 0;
ZeroStruct(&ibv);
Assert(0); // Invalid index size Assert(0); // Invalid index size
} }
} }
@ -3411,14 +3488,14 @@ i64 G_CommitCommandList(G_CommandListHandle cl_handle)
for (u32 i = 0; i < countof(cmd->draw.render_target_descs); ++i) for (u32 i = 0; i < countof(cmd->draw.render_target_descs); ++i)
{ {
G_RenderTargetDesc desc = cmd->draw.render_target_descs[i]; G_RenderTargetDesc desc = cmd->draw.render_target_descs[i];
G_D12_Resource *rt = G_D12_ResourceFromHandle(desc.resource); G_D12_Resource *rt = G_D12_ResourceFromTextureRef(desc.texture);
if (rt) if (rt)
{ {
Assert(AnyBit(rt->d3d_desc.Flags, D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET)); Assert(AnyBit(rt->d3d_desc.Flags, D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET));
if (bound_render_target_uids[i] != rt->uid + desc.mip) if (bound_render_target_uids[i] != rt->uid + desc.mip)
{ {
G_D12_Descriptor *rtv_descriptor = rcl->rtv_descriptors[i]; G_D12_Descriptor *rtv_descriptor = rcl->rtv_descriptors[i];
G_D12_InitRtv(rt, rtv_descriptor->first_handle, desc.mip); G_D12_InitRtvDescriptorFromResource(rtv_descriptor, rt, desc.mip);
bound_render_target_uids[i] = rt->uid + desc.mip; bound_render_target_uids[i] = rt->uid + desc.mip;
om_dirty = 1; om_dirty = 1;
} }
@ -3434,7 +3511,7 @@ i64 G_CommitCommandList(G_CommandListHandle cl_handle)
D3D12_CPU_DESCRIPTOR_HANDLE rtv_handles[G_MaxRenderTargets] = Zi; D3D12_CPU_DESCRIPTOR_HANDLE rtv_handles[G_MaxRenderTargets] = Zi;
for (u32 i = 0; i < rtvs_count; ++i) for (u32 i = 0; i < rtvs_count; ++i)
{ {
rtv_handles[i] = rcl->rtv_descriptors[i]->first_handle; rtv_handles[i] = rcl->rtv_descriptors[i]->d3d_handle;
} }
ID3D12GraphicsCommandList_OMSetRenderTargets(d3d_cl, rtvs_count, rtv_handles, 0, 0); ID3D12GraphicsCommandList_OMSetRenderTargets(d3d_cl, rtvs_count, rtv_handles, 0, 0);
} }
@ -3458,14 +3535,14 @@ i64 G_CommitCommandList(G_CommandListHandle cl_handle)
clear_color[2] = cmd->clear_rtv.color.z; clear_color[2] = cmd->clear_rtv.color.z;
clear_color[3] = cmd->clear_rtv.color.w; clear_color[3] = cmd->clear_rtv.color.w;
} }
D3D12_CPU_DESCRIPTOR_HANDLE rtv_handle = rcl->rtv_clear_descriptor->first_handle; G_D12_Descriptor *descriptor = rcl->rtv_clear_descriptor;
if (bound_render_clear_target_uid != resource->uid + cmd->clear_rtv.mip) if (bound_render_clear_target_uid != resource->uid + cmd->clear_rtv.mip)
{ {
G_D12_InitRtv(resource, rtv_handle, cmd->clear_rtv.mip); G_D12_InitRtvDescriptor(descriptor, resource, cmd->clear_rtv.mip);
bound_render_clear_target_uid = resource->uid + cmd->clear_rtv.mip; bound_render_clear_target_uid = resource->uid + cmd->clear_rtv.mip;
} }
G_D12_InsertEvent(d3d_cl, G_D12_EventKind_Marker, STRING(resource->name_len, (u8 *)resource->name_cstr)); G_D12_InsertEvent(d3d_cl, G_D12_EventKind_Marker, STRING(resource->name_len, (u8 *)resource->name_cstr));
ID3D12GraphicsCommandList_ClearRenderTargetView(d3d_cl, rtv_handle, clear_color, 0, 0); ID3D12GraphicsCommandList_ClearRenderTargetView(d3d_cl, descriptor->d3d_handle, clear_color, 0, 0);
} break; } break;
//- Discard //- Discard
@ -3501,18 +3578,19 @@ i64 G_CommitCommandList(G_CommandListHandle cl_handle)
////////////////////////////// //////////////////////////////
//- Attach completion info to reset descriptors //- Attach completion info to reset descriptors
for (G_D12_Descriptor *d = cl->reset_descriptors.first; d;) for (G_D12_Descriptor *descriptor = cl->reset_descriptors.first; descriptor; descriptor = descriptor->next)
{ {
G_D12_Descriptor *next = d->next; G_D12_Descriptor *next = descriptor->next;
{ {
G_D12_Arena *gpu_arena = d->gpu_arena; G_D12_Arena *gpu_arena = descriptor->gpu_arena;
d->completion_queue_kind = queue_kind; descriptor->completion_queue_kind = queue_kind;
d->completion_queue_target = completion_target; descriptor->completion_queue_target = completion_target;
G_D12_DescriptorList *gpu_arena_reset_descriptors_list = &gpu_arena->reset_descriptors_by_heap[d->heap->kind]; G_D12_DescriptorTable *dst_table = &gpu_arena->reset_descriptor_tables_by_heap[descriptor->heap->kind];
DllQueuePush(gpu_arena_reset_descriptors_list->first, gpu_arena_reset_descriptors_list->last, d); G_D12_DescriptorList *dst_list = &dst_table->descriptors_by_bundle_count[descriptor->bundle_count];
++gpu_arena_reset_descriptors_list->count; DllQueuePush(dst_list->first, dst_list->last, descriptor);
++dst_list->count;
} }
d = next; descriptor = next;
} }
////////////////////////////// //////////////////////////////
@ -3604,7 +3682,7 @@ void G_SyncLayout(G_CommandListHandle cl_handle, G_TextureRef texture, G_Texture
G_D12_CmdList *cl = G_D12_CmdListFromHandle(cl_handle); G_D12_CmdList *cl = G_D12_CmdListFromHandle(cl_handle);
G_D12_Cmd *cmd = G_D12_PushCmd(cl); G_D12_Cmd *cmd = G_D12_PushCmd(cl);
cmd->kind = G_D12_CmdKind_Barrier; cmd->kind = G_D12_CmdKind_Barrier;
cmd->barrier.resource = G_ResourceFromRef(texture); cmd->barrier.texture = texture;
cmd->barrier.acquire = layout == G_TextureLayout_Family; cmd->barrier.acquire = layout == G_TextureLayout_Family;
} }
@ -3628,7 +3706,7 @@ void G_PopZoneEx(G_CommandListHandle cl_handle)
//- Cpu -> Gpu staged copy //- Cpu -> Gpu staged copy
void G_CopyCpuToBuffer(G_CommandListHandle cl_handle, G_ResourceHandle dst_handle, u64 dst_offset, void *src, RngU64 src_copy_range) void G_CopyCpuToBuffer(G_CommandListHandle cl_handle, G_BufferRef dst, u64 dst_offset, void *src, RngU64 src_copy_range)
{ {
if (src_copy_range.max > src_copy_range.min) if (src_copy_range.max > src_copy_range.min)
{ {
@ -3638,15 +3716,15 @@ void G_CopyCpuToBuffer(G_CommandListHandle cl_handle, G_ResourceHandle dst_handl
CopyBytes((u8 *)region->ring->base + region->pos, (u8 *)src + src_copy_range.min, copy_size); CopyBytes((u8 *)region->ring->base + region->pos, (u8 *)src + src_copy_range.min, copy_size);
G_CopyBufferToBuffer( G_CopyBufferToBuffer(
cl_handle, cl_handle,
dst_handle, dst,
dst_offset, dst_offset,
G_D12_MakeHandle(G_ResourceHandle, region->ring->resource), region->ring->buffer,
RNGU64(region->pos, region->pos + copy_size) RNGU64(region->pos, region->pos + copy_size)
); );
} }
} }
void G_CopyCpuToTexture(G_CommandListHandle cl_handle, G_ResourceHandle dst_handle, Vec3I32 dst_offset, void *src, Vec3I32 src_dims, Rng3I32 src_copy_range) void G_CopyCpuToTexture(G_CommandListHandle cl_handle, G_TextureRef dst, Vec3I32 dst_offset, void *src, Vec3I32 src_dims, Rng3I32 src_copy_range)
{ {
Vec3I32 staged_dims = Zi; Vec3I32 staged_dims = Zi;
{ {
@ -3657,8 +3735,8 @@ void G_CopyCpuToTexture(G_CommandListHandle cl_handle, G_ResourceHandle dst_hand
if (staged_dims.x > 0 && staged_dims.y > 0 && staged_dims.z > 0) if (staged_dims.x > 0 && staged_dims.y > 0 && staged_dims.z > 0)
{ {
G_D12_CmdList *cl = G_D12_CmdListFromHandle(cl_handle); G_D12_CmdList *cl = G_D12_CmdListFromHandle(cl_handle);
G_D12_Resource *dst = G_D12_ResourceFromHandle(dst_handle); G_D12_Resource *dst_resource = G_D12_ResourceFromTextureRef(dst);
Assert(dst->is_texture); Assert(dst_resource->is_texture);
// Grab footprint info // Grab footprint info
u64 staging_footprint_rows_count = 0; u64 staging_footprint_rows_count = 0;
@ -3669,7 +3747,7 @@ void G_CopyCpuToTexture(G_CommandListHandle cl_handle, G_ResourceHandle dst_hand
{ {
D3D12_RESOURCE_DESC src_desc = Zi; D3D12_RESOURCE_DESC src_desc = Zi;
{ {
ID3D12Resource_GetDesc(dst->d3d_resource, &src_desc); ID3D12Resource_GetDesc(dst_resource->d3d_resource, &src_desc);
src_desc.Width = staged_dims.x; src_desc.Width = staged_dims.x;
src_desc.Height = staged_dims.y; src_desc.Height = staged_dims.y;
src_desc.DepthOrArraySize = staged_dims.z; src_desc.DepthOrArraySize = staged_dims.z;
@ -3682,8 +3760,8 @@ void G_CopyCpuToTexture(G_CommandListHandle cl_handle, G_ResourceHandle dst_hand
u64 src_row_pitch = src_dims.x * bytes_per_texel; u64 src_row_pitch = src_dims.x * bytes_per_texel;
G_D12_StagingRegionNode *staging_region = G_D12_PushStagingRegion(cl, staging_footprint_size); G_D12_StagingRegionNode *staging_region = G_D12_PushStagingRegion(cl, staging_footprint_size);
G_D12_Resource *staging_resource = staging_region->ring->resource; G_BufferRef staging_buffer = staging_region->ring->buffer;
G_ResourceHandle staging_resource_handle = G_D12_MakeHandle(G_ResourceHandle, staging_resource); G_D12_Resource *staging_resource = G_D12_ResourceFromBufferRef(staging_buffer);
staging_footprint.Offset = staging_region->pos; staging_footprint.Offset = staging_region->pos;
// Fill staging buffer // Fill staging buffer
@ -3712,29 +3790,29 @@ void G_CopyCpuToTexture(G_CommandListHandle cl_handle, G_ResourceHandle dst_hand
dst_copy_range.p1.z = dst_copy_range.p0.z + staged_dims.z; dst_copy_range.p1.z = dst_copy_range.p0.z + staged_dims.z;
G_CopyBufferToTexture( G_CopyBufferToTexture(
cl_handle, cl_handle,
dst_handle, dst_copy_range, dst, dst_copy_range,
staging_resource_handle, staging_footprint.Offset staging_buffer, staging_footprint.Offset
); );
} }
} }
//- Gpu <-> Gpu copy //- Gpu <-> Gpu copy
void G_CopyBufferToBuffer(G_CommandListHandle cl_handle, G_ResourceHandle dst_handle, u64 dst_offset, G_ResourceHandle src_handle, RngU64 src_copy_range) void G_CopyBufferToBuffer(G_CommandListHandle cl_handle, G_BufferRef dst, u64 dst_offset, G_BufferRef src, RngU64 src_copy_range)
{ {
if (src_copy_range.max > src_copy_range.min) if (src_copy_range.max > src_copy_range.min)
{ {
G_D12_CmdList *cl = G_D12_CmdListFromHandle(cl_handle); G_D12_CmdList *cl = G_D12_CmdListFromHandle(cl_handle);
G_D12_Cmd *cmd = G_D12_PushCmd(cl); G_D12_Cmd *cmd = G_D12_PushCmd(cl);
cmd->kind = G_D12_CmdKind_CopyBytes; cmd->kind = G_D12_CmdKind_CopyBytes;
cmd->copy_bytes.src = G_D12_ResourceFromHandle(src_handle); cmd->copy_bytes.src = G_D12_ResourceFromBufferRef(src);
cmd->copy_bytes.dst = G_D12_ResourceFromHandle(dst_handle); cmd->copy_bytes.dst = G_D12_ResourceFromBufferRef(dst);
cmd->copy_bytes.dst_offset = dst_offset; cmd->copy_bytes.dst_offset = dst_offset;
cmd->copy_bytes.src_range = src_copy_range; cmd->copy_bytes.src_range = src_copy_range;
} }
} }
void G_CopyBufferToTexture(G_CommandListHandle cl_handle, G_ResourceHandle dst_handle, Rng3I32 dst_copy_range, G_ResourceHandle src_handle, u64 src_offset) void G_CopyBufferToTexture(G_CommandListHandle cl_handle, G_TextureRef dst_ref, Rng3I32 dst_copy_range, G_BufferRef src_ref, u64 src_offset)
{ {
Vec3I32 src_dims = Zi; Vec3I32 src_dims = Zi;
{ {
@ -3745,8 +3823,8 @@ void G_CopyBufferToTexture(G_CommandListHandle cl_handle, G_ResourceHandle dst_h
if (src_dims.x > 0 && src_dims.y > 0 && src_dims.z > 0) if (src_dims.x > 0 && src_dims.y > 0 && src_dims.z > 0)
{ {
G_D12_CmdList *cl = G_D12_CmdListFromHandle(cl_handle); G_D12_CmdList *cl = G_D12_CmdListFromHandle(cl_handle);
G_D12_Resource *src = G_D12_ResourceFromHandle(src_handle); G_D12_Resource *src = G_D12_ResourceFromBufferRef(src_ref);
G_D12_Resource *dst = G_D12_ResourceFromHandle(dst_handle); G_D12_Resource *dst = G_D12_ResourceFromTextureRef(dst_ref);
Assert(!src->is_texture); Assert(!src->is_texture);
Assert(dst->is_texture); Assert(dst->is_texture);
@ -3787,7 +3865,7 @@ void G_CopyBufferToTexture(G_CommandListHandle cl_handle, G_ResourceHandle dst_h
} }
} }
void G_CopyTextureToTexture(G_CommandListHandle cl_handle, G_ResourceHandle dst_handle, Vec3I32 dst_offset, G_ResourceHandle src_handle, Rng3I32 src_copy_range) void G_CopyTextureToTexture(G_CommandListHandle cl_handle, G_TextureRef dst_ref, Vec3I32 dst_offset, G_TextureRef src_ref, Rng3I32 src_copy_range)
{ {
if ( if (
src_copy_range.p1.x > src_copy_range.p0.x && src_copy_range.p1.x > src_copy_range.p0.x &&
@ -3796,8 +3874,8 @@ void G_CopyTextureToTexture(G_CommandListHandle cl_handle, G_ResourceHandle dst_
) )
{ {
G_D12_CmdList *cl = G_D12_CmdListFromHandle(cl_handle); G_D12_CmdList *cl = G_D12_CmdListFromHandle(cl_handle);
G_D12_Resource *src = G_D12_ResourceFromHandle(src_handle); G_D12_Resource *src = G_D12_ResourceFromTextureRef(src_ref);
G_D12_Resource *dst = G_D12_ResourceFromHandle(dst_handle); G_D12_Resource *dst = G_D12_ResourceFromTextureRef(dst_ref);
Assert(src->is_texture); Assert(src->is_texture);
Assert(dst->is_texture); Assert(dst->is_texture);
@ -3825,7 +3903,7 @@ void G_CopyTextureToTexture(G_CommandListHandle cl_handle, G_ResourceHandle dst_
} }
} }
void G_CopyTextureToBuffer(G_CommandListHandle cl_handle, G_ResourceHandle dst_handle, Vec3I32 dst_offset, G_ResourceHandle src_handle, Rng3I32 src_copy_range) void G_CopyTextureToBuffer(G_CommandListHandle cl_handle, G_BufferRef dst, Vec3I32 dst_offset, G_TextureRef src, Rng3I32 src_copy_range)
{ {
// TODO // TODO
Assert(0); Assert(0);
@ -3850,13 +3928,13 @@ void G_ComputeEx(G_CommandListHandle cl_handle, ComputeShaderDesc cs, Vec3I32 th
void G_Draw( void G_Draw(
G_CommandListHandle cl_handle, G_CommandListHandle cl_handle,
VertexShaderDesc vs, PixelShaderDesc ps, VertexShaderDesc vs, PixelShaderDesc ps,
u32 instances_count, G_IndexBufferDesc index_buffer, u32 instances_count, G_BufferRef indices,
u32 render_targets_count, G_RenderTargetDesc *render_targets, u32 render_targets_count, G_RenderTargetDesc *render_targets,
Rng3 viewport, Rng2 scissor, Rng3 viewport, Rng2 scissor,
G_DrawMode draw_mode G_DrawMode draw_mode
) )
{ {
if (instances_count > 0 && index_buffer.count > 0) if (instances_count > 0 && G_CountBuffer(indices) > 0)
{ {
G_D12_CmdList *cl = G_D12_CmdListFromHandle(cl_handle); G_D12_CmdList *cl = G_D12_CmdListFromHandle(cl_handle);
G_D12_Cmd *cmd = G_D12_PushCmd(cl); G_D12_Cmd *cmd = G_D12_PushCmd(cl);
@ -3864,7 +3942,7 @@ void G_Draw(
cmd->draw.vs = vs; cmd->draw.vs = vs;
cmd->draw.ps = ps; cmd->draw.ps = ps;
cmd->draw.instances_count = instances_count; cmd->draw.instances_count = instances_count;
cmd->draw.index_buffer_desc = index_buffer; cmd->draw.indices = indices;
for (u32 rt_idx = 0; rt_idx < MinU32(render_targets_count, G_MaxRenderTargets); ++rt_idx) for (u32 rt_idx = 0; rt_idx < MinU32(render_targets_count, G_MaxRenderTargets); ++rt_idx)
{ {
cmd->draw.render_target_descs[rt_idx] = render_targets[rt_idx]; cmd->draw.render_target_descs[rt_idx] = render_targets[rt_idx];
@ -3877,12 +3955,12 @@ void G_Draw(
//- Clear //- Clear
void G_ClearRenderTarget(G_CommandListHandle cl_handle, G_ResourceHandle resource_handle, Vec4 color, i32 mip) void G_ClearRenderTarget(G_CommandListHandle cl_handle, G_TextureRef texture, Vec4 color, i32 mip)
{ {
G_D12_CmdList *cl = G_D12_CmdListFromHandle(cl_handle); G_D12_CmdList *cl = G_D12_CmdListFromHandle(cl_handle);
G_D12_Cmd *cmd = G_D12_PushCmd(cl); G_D12_Cmd *cmd = G_D12_PushCmd(cl);
cmd->kind = G_D12_CmdKind_ClearRtv; cmd->kind = G_D12_CmdKind_ClearRtv;
cmd->clear_rtv.resource = G_D12_ResourceFromHandle(resource_handle); cmd->clear_rtv.resource = G_D12_ResourceFromTextureRef(texture);
cmd->clear_rtv.color = color; cmd->clear_rtv.color = color;
cmd->clear_rtv.mip = mip; cmd->clear_rtv.mip = mip;
} }
@ -4036,7 +4114,7 @@ void G_ReleaseSwapchain(G_SwapchainHandle swapchain_handle)
// TODO // TODO
} }
G_ResourceHandle G_PrepareBackbuffer(G_SwapchainHandle swapchain_handle, G_Format format, Vec2I32 size) G_TextureRef G_PrepareBackbuffer(G_SwapchainHandle swapchain_handle, G_Format format, Vec2I32 size)
{ {
G_D12_Swapchain *swapchain = G_D12_SwapchainFromHandle(swapchain_handle); G_D12_Swapchain *swapchain = G_D12_SwapchainFromHandle(swapchain_handle);
TempArena scratch = BeginScratchNoConflict(); TempArena scratch = BeginScratchNoConflict();
@ -4162,7 +4240,7 @@ G_ResourceHandle G_PrepareBackbuffer(G_SwapchainHandle swapchain_handle, G_Forma
Panic(Lit("Failed to retrieve swapchain buffer")); Panic(Lit("Failed to retrieve swapchain buffer"));
} }
ZeroStruct(backbuffer); ZeroStruct(backbuffer);
backbuffer->flags = G_MemoryFlag_AllowRenderTarget; backbuffer->flags = G_MemoryFlag_AllowTextureDraw;
backbuffer->uid = Atomic64FetchAdd(&G_D12.resource_creation_gen.v, 1) + 1; backbuffer->uid = Atomic64FetchAdd(&G_D12.resource_creation_gen.v, 1) + 1;
ID3D12Resource_GetDesc(d3d_resource, (D3D12_RESOURCE_DESC *)&backbuffer->d3d_desc); ID3D12Resource_GetDesc(d3d_resource, (D3D12_RESOURCE_DESC *)&backbuffer->d3d_desc);
@ -4310,10 +4388,11 @@ void G_D12_CollectionWorkerEntryPoint(WaveLaneCtx *lane)
G_D12_Queue *queue = G_D12_QueueFromKind(queue_kind); G_D12_Queue *queue = G_D12_QueueFromKind(queue_kind);
if (!G_IsResourceNil(queue->print_buffer)) if (!G_IsResourceNil(queue->print_buffer))
{ {
u32 attempted_print_bytes_count = *(G_StructFromResource(queue->print_readback_buffer, u32) + 0); // The number of bytes shaders attempted to write u32 header = G_Deref(queue->print_readback_buffer, u32);
u32 prints_count = *(G_StructFromResource(queue->print_readback_buffer, u32) + 1); // The number of shader prints that are in the buffer u32 attempted_print_bytes_count = header[0]; // The number of bytes that shaders attempted to write
u32 overflows_count = *(G_StructFromResource(queue->print_readback_buffer, u32) + 2); // The number of shader prints that could not fit in the buffer u32 prints_count = header[1]; // The number of individual shader prints that are in the buffer
u8 *start = G_StructFromResource(queue->print_readback_buffer, u8) + 12; u32 overflows_count = header[2]; // The number of individual shader prints that could not fit in the buffer
u8 *start = &header[3];
// Deserialize // Deserialize
if (GPU_SHADER_PRINT_LOG) if (GPU_SHADER_PRINT_LOG)

View File

@ -81,10 +81,6 @@ Struct(G_D12_Resource)
D3D12_GPU_VIRTUAL_ADDRESS buffer_gpu_address; D3D12_GPU_VIRTUAL_ADDRESS buffer_gpu_address;
void *mapped; void *mapped;
// Buffer info
u64 buffer_size;
u64 buffer_size_actual;
// Texture info // Texture info
b32 is_texture; b32 is_texture;
G_Format texture_format; G_Format texture_format;
@ -141,38 +137,35 @@ Struct(G_D12_DescriptorHeap)
struct G_D12_Descriptor *first_free_descriptor_by_count[G_D12_MaxDescriptorBundleCount]; struct G_D12_Descriptor *first_free_descriptor_by_count[G_D12_MaxDescriptorBundleCount];
}; };
Struct(G_D12_DescriptorDesc) Struct(G_D12_Descriptor)
{ {
G_D12_Descriptor *next;
G_D12_Descriptor *prev;
// Persistent data
G_D12_DescriptorHeap *heap;
D3D12_CPU_DESCRIPTOR_HANDLE d3d_handle;
u32 base_index;
// Per-lifetime data
struct G_D12_Arena *gpu_arena;
G_D12_Resource *resource; G_D12_Resource *resource;
u32 bundle_count; u64 bundle_count;
u64 buffer_element_offset; u64 buffer_element_offset;
u64 buffer_element_count; u64 buffer_element_count;
u64 buffer_element_stride; u64 buffer_element_stride;
RngI32 texture_mips; RngI32 texture_mips;
};
Struct(G_D12_Descriptor)
{
G_D12_Descriptor *next;
G_D12_Descriptor *prev;
// Static data
G_D12_DescriptorHeap *heap;
u32 base_index;
// Per-lifetime data
struct G_D12_Arena *gpu_arena;
G_D12_DescriptorDesc desc;
G_QueueKind completion_queue_kind; G_QueueKind completion_queue_kind;
i64 completion_queue_target; i64 completion_queue_target;
}; };
Struct(G_D12_DescriptorList) Struct(G_D12_DescriptorList)
{ {
u64 count; u64 count;
@ -180,18 +173,18 @@ Struct(G_D12_DescriptorList)
G_D12_Descriptor *last; G_D12_Descriptor *last;
}; };
Struct(G_D12_DescriptorTable)
{
G_D12_DescriptorList descriptors_by_bundle_count[G_D12_MaxDescriptorBundleCount];
};
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
//~ Arena types //~ Arena types
// TODO:
// To support D3D12_RESOURCE_HEAP_TIER_1 devices, create separate heaps for:
// - Buffers
// - Non-render target & non-depth stencil textures
// - Render target or depth stencil textures
Enum(G_D12_ResourceHeapKind) Enum(G_D12_ResourceHeapKind)
{ {
G_D12_ResourceHeapKind_Gpu, G_D12_ResourceHeapKind_Gpu,
G_D12_ResourceHeapKind_Cpu, G_D12_ResourceHeapKind_CpuWriteBack,
G_D12_ResourceHeapKind_CpuWriteCombined, G_D12_ResourceHeapKind_CpuWriteCombined,
G_D12_ResourceHeapKind_COUNT G_D12_ResourceHeapKind_COUNT
@ -202,11 +195,10 @@ Struct(G_D12_Arena)
Arena *arena; Arena *arena;
G_D12_DescriptorList descriptors; G_D12_DescriptorList descriptors;
G_D12_DescriptorList reset_descriptors_by_heap[G_D12_DescriptorHeapKind_COUNT]; G_D12_DescriptorTable reset_descriptor_tables_by_heap[G_D12_DescriptorHeapKind_COUNT];
G_D12_ResourceList resources; G_D12_ResourceList resources;
G_D12_ResourceList reset_resources; G_D12_ResourceList reset_resources;
// G_D12_ResourceList free_resources;
}; };
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
@ -223,7 +215,6 @@ Struct(G_D12_StagingRing)
struct G_D12_StagingRegionNode *head_region_node; struct G_D12_StagingRegionNode *head_region_node;
struct G_D12_StagingRegionNode *first_free_region_node; struct G_D12_StagingRegionNode *first_free_region_node;
}; };
Struct(G_D12_StagingRegionNode) Struct(G_D12_StagingRegionNode)
@ -306,6 +297,22 @@ Struct(G_D12_Releasable)
i64 completion_queue_target; i64 completion_queue_target;
ID3D12Resource *d3d_resource; ID3D12Resource *d3d_resource;
// FIXME: Release descriptors as well
}; };
Struct(G_D12_ReleasableList) Struct(G_D12_ReleasableList)
@ -354,7 +361,7 @@ Struct(G_D12_Cmd)
struct struct
{ {
G_D12_Resource *resource; G_TextureRef texture;
b32 acquire; b32 acquire;
} barrier; } barrier;
@ -393,7 +400,7 @@ Struct(G_D12_Cmd)
VertexShaderDesc vs; VertexShaderDesc vs;
PixelShaderDesc ps; PixelShaderDesc ps;
u32 instances_count; u32 instances_count;
G_IndexBufferDesc index_buffer_desc; G_BufferRef indices;
G_RenderTargetDesc render_target_descs[G_MaxRenderTargets]; G_RenderTargetDesc render_target_descs[G_MaxRenderTargets];
Rng3 viewport; Rng3 viewport;
Rng2 scissor; Rng2 scissor;
@ -705,14 +712,11 @@ DeclApiFromXList(G_D12_AgsApi, G_D12_AgsApiXList, "amd_ags_x64.dll");
G_D12_Arena *G_D12_ArenaFromHandle(G_ArenaHandle handle); G_D12_Arena *G_D12_ArenaFromHandle(G_ArenaHandle handle);
G_D12_CmdList *G_D12_CmdListFromHandle(G_CommandListHandle handle); G_D12_CmdList *G_D12_CmdListFromHandle(G_CommandListHandle handle);
G_D12_Resource *G_D12_ResourceFromHandle(G_ResourceHandle handle);
G_D12_Swapchain *G_D12_SwapchainFromHandle(G_SwapchainHandle handle); G_D12_Swapchain *G_D12_SwapchainFromHandle(G_SwapchainHandle handle);
DXGI_FORMAT G_D12_DxgiFormatFromGpuFormat(G_Format format); DXGI_FORMAT G_D12_DxgiFormatFromGpuFormat(G_Format format);
D3D12_BARRIER_LAYOUT G_D12_CommonLayoutFromQueueKind(G_QueueKind queue_kind); D3D12_BARRIER_LAYOUT G_D12_CommonLayoutFromQueueKind(G_QueueKind queue_kind);
void G_D12_InitRtv(G_D12_Resource *resource, D3D12_CPU_DESCRIPTOR_HANDLE rtv_handle, i32 mip);
void G_D12_SetObjectName(ID3D12Object *object, String name); void G_D12_SetObjectName(ID3D12Object *object, String name);
String G_D12_NameFromObject(Arena *arena, ID3D12Object *object); String G_D12_NameFromObject(Arena *arena, ID3D12Object *object);
@ -744,7 +748,9 @@ void G_D12_ResetArena(G_D12_CmdList *cl, G_D12_Arena *gpu_arena);
// G_D12_Descriptor *G_D12_DescriptorFromIndex(G_D12_DescriptorHeapKind heap_kind, u32 index); // G_D12_Descriptor *G_D12_DescriptorFromIndex(G_D12_DescriptorHeapKind heap_kind, u32 index);
// G_D12_Descriptor *G_D12_PushDescriptor(G_D12_Arena *gpu_arena, G_D12_DescriptorHeapKind heap_kind); // G_D12_Descriptor *G_D12_PushDescriptor(G_D12_Arena *gpu_arena, G_D12_DescriptorHeapKind heap_kind);
G_D12_Descriptor *G_D12_PushDescriptor(G_D12_Arena *gpu_arena, G_D12_DescriptorDesc desc, G_D12_DescriptorHeapKind heap_kind); G_D12_Descriptor *G_D12_PushDescriptor(G_D12_Arena *gpu_arena, u64 bundle_count, G_D12_DescriptorHeapKind heap_kind);
void G_D12_InitRtvDescriptor(G_D12_Descriptor *descriptor, G_D12_Resource *resource, i32 mip);
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
//~ Command helpers //~ Command helpers

View File

@ -7,6 +7,14 @@ Struct(G_BufferRef) { G_BaseDescriptorIndex v; };
Struct(G_TextureRef) { G_BaseDescriptorIndex v; }; Struct(G_TextureRef) { G_BaseDescriptorIndex v; };
Struct(G_SamplerRef) { G_BaseDescriptorIndex v; }; Struct(G_SamplerRef) { G_BaseDescriptorIndex v; };
#define G_MakeBufferRef(_v) ((G_BufferRef) { .v = (_v) })
#define G_MakeTextureRef(_v) ((G_TextureRef) { .v = (_v) })
#define G_MakeSamplerRef(_v) ((G_SamplerRef) { .v = (_v) })
#define G_NilBufferRef G_MakeBufferRef(0)
#define G_NilTextureRef G_MakeTextureRef(0)
#define G_NilSamplerRef G_MakeSamplerRef(0)
#define G_IsRefNil(r) ((r).v == 0) #define G_IsRefNil(r) ((r).v == 0)
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
@ -19,18 +27,18 @@ Struct(G_SamplerRef) { G_BaseDescriptorIndex v; };
// //
#define G_NumGeneralPurposeConstants (24) // Constants available for any usage #define G_NumGeneralPurposeConstants (24) // Constants available for any usage
#define G_NumReservedConstants (4) // Constants reserved for internal usage by the GPU layer #define G_NumReservedConstants (4) // Constants reserved for internal usage by the GPU layer
#define G_NumConstants (G_NumGeneralPurposeConstants + G_NumReservedConstants) #define G_NumConstants (G_NumGeneralPurposeConstants + G_NumReservedConstants)
#if IsCpu #if IsCpu
#define G_ForceDeclConstant(type, name, slot) \ #define G_ForceDeclConstant(type, name, slot) \
enum { name = slot }; \ enum { name = slot }; \
Struct(name##__shaderconstanttype) { type v; } Struct(CAT(__ShaderConstantType_,name)) { type v; }
#define G_DeclConstant(type, name, slot) \ #define G_DeclConstant(type, name, slot) \
StaticAssert(sizeof(type) <= 4); \ StaticAssert(sizeof(type) <= 4); \
StaticAssert(slot < G_NumGeneralPurposeConstants); \ StaticAssert(slot < G_NumGeneralPurposeConstants); \
G_ForceDeclConstant(type, name, slot) G_ForceDeclConstant(type, name, slot)
#else #else
#define G_ForceDeclConstant(type, name, slot) cbuffer name : register(b##slot) { type name; } #define G_ForceDeclConstant(type, name, slot) cbuffer name : register(CAT(b,slot)) { type name; }
#define G_DeclConstant(type, name, slot) G_ForceDeclConstant(type, name, slot) #define G_DeclConstant(type, name, slot) G_ForceDeclConstant(type, name, slot)
#endif #endif