Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions src/igl/Buffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,21 @@ struct BufferDesc {
/** @brief Identifier used for debugging */
std::string debugName;

/**
* @brief Element stride in bytes for storage buffers.
*
* For buffers created with BufferTypeBits::Storage, this describes the size of a single
* structured element when the buffer is viewed as a StructuredBuffer / RWStructuredBuffer.
*
* Backends that create structured SRV/UAV views (such as D3D12) use this value to populate
* D3D12_BUFFER_SRV / D3D12_BUFFER_UAV StructureByteStride and to compute NumElements.
*
* A value of 0 means "unknown/unspecified" and backends may fall back to a default
* element size (typically 4 bytes) for compatibility with existing code that assumes
* float / uint elements.
*/
size_t storageStride = 0;

BufferDesc(BufferType type = 0,
const void* IGL_NULLABLE data = nullptr,
size_t length = 0,
Expand Down
11 changes: 10 additions & 1 deletion src/igl/Common.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,14 @@ using Deleter = void (*)(void* IGL_NULLABLE);

/// Device Capabilities or Metal Features
constexpr uint32_t IGL_TEXTURE_SAMPLERS_MAX = 16;
constexpr uint32_t IGL_VERTEX_ATTRIBUTES_MAX = 24;

// Maximum vertex attributes across all backends
// - D3D12: D3D12_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT = 32
// - Vulkan: VkPhysicalDeviceLimits::maxVertexInputAttributes (typically >= 16, commonly 32)
// - Metal: 31 (Metal Feature Set Tables)
// - OpenGL: GL_MAX_VERTEX_ATTRIBS (typically >= 16)
// Setting to 32 ensures compatibility with D3D12 (the most widely-supported modern API)
constexpr uint32_t IGL_VERTEX_ATTRIBUTES_MAX = 32;

// maximum number of buffers that can be bound to a shader stage
// See maximum number of entries in the buffer argument table, per graphics or kernel function
Expand Down Expand Up @@ -136,6 +143,7 @@ enum class BackendType {
OpenGL,
Metal,
Vulkan,
D3D12,
// @fb-only
Custom,
};
Expand All @@ -146,6 +154,7 @@ enum class BackendFlavor : uint8_t {
OpenGL_ES,
Metal,
Vulkan,
D3D12,
// @fb-only
};

Expand Down
2 changes: 2 additions & 0 deletions src/igl/Device.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ Color IDevice::backendDebugColor() const noexcept {
return {1.f, 0.f, 1.f, 1.f};
case BackendType::Vulkan:
return {0.f, 1.f, 1.f, 1.f};
case BackendType::D3D12:
return {0.f, 1.f, 1.f, 1.f}; // Match Vulkan for parity testing
// @fb-only
// @fb-only
case BackendType::Custom:
Expand Down
50 changes: 37 additions & 13 deletions src/igl/DeviceFeatures.h
Original file line number Diff line number Diff line change
Expand Up @@ -154,18 +154,30 @@ enum class DeviceRequirement {
* @brief DeviceFeatureLimits provides specific limitations on certain features supported on the
* device
*
* BufferAlignment Required byte alignment for buffer data
* BufferNoCopyAlignment Required byte alignment for no copy buffer data
* MaxBindBytesBytes Maximum number of bytes that can be bound with bindBytes
* MaxCubeMapDimension Maximum cube map dimensions
* MaxFragmentUniformVectors Maximum fragment uniform vectors
* MaxMultisampleCount Maximum number of samples
* MaxPushConstantBytes Maximum number of bytes for Push Constants
* MaxTextureDimension1D2D Maximum texture dimensions
* MaxUniformBufferBytes Maximum number of bytes for a uniform buffer
* MaxStorageBufferBytes Maximum number of bytes for storage buffers
* MaxVertexUniformVectors Maximum vertex uniform vectors
* PushConstantsAlignment Required byte alignment for push constants data
* BufferAlignment Required byte alignment for buffer data
* BufferNoCopyAlignment Required byte alignment for no copy buffer data
* MaxBindBytesBytes Maximum number of bytes that can be bound with bindBytes
* MaxCubeMapDimension Maximum cube map dimensions
* MaxFragmentUniformVectors Maximum fragment uniform vectors
* MaxMultisampleCount Maximum number of samples
* MaxPushConstantBytes Maximum number of bytes for Push Constants
* MaxTextureDimension1D2D Maximum texture dimensions for 1D and 2D textures
* MaxTextureDimension3D Maximum texture dimensions for 3D textures
* MaxStorageBufferBytes Maximum number of bytes for storage buffers
* MaxUniformBufferBytes Maximum number of bytes for a uniform buffer
* MaxVertexUniformVectors Maximum vertex uniform vectors
* PushConstantsAlignment Required byte alignment for push constants data
* ShaderStorageBufferOffsetAlignment Required byte alignment for shader storage buffer offset
* MaxComputeWorkGroupSizeX Maximum compute work group size in X dimension
* MaxComputeWorkGroupSizeY Maximum compute work group size in Y dimension
* MaxComputeWorkGroupSizeZ Maximum compute work group size in Z dimension
* MaxComputeWorkGroupInvocations Maximum total compute work group invocations
* MaxVertexInputAttributes Maximum number of vertex input attributes
* MaxColorAttachments Maximum number of color attachments (render targets)
* MaxDescriptorHeapCbvSrvUav Maximum CBV/SRV/UAV descriptors in shader-visible heap (I-005)
* MaxDescriptorHeapSamplers Maximum sampler descriptors in shader-visible heap (I-005)
* MaxDescriptorHeapRtvs Maximum RTV descriptors in CPU-visible heap (I-005)
* MaxDescriptorHeapDsvs Maximum DSV descriptors in CPU-visible heap (I-005)
*/
enum class DeviceFeatureLimits {
BufferAlignment = 0,
Expand All @@ -176,11 +188,23 @@ enum class DeviceFeatureLimits {
MaxMultisampleCount,
MaxPushConstantBytes,
MaxTextureDimension1D2D,
MaxTextureDimension3D,
MaxStorageBufferBytes,
MaxUniformBufferBytes,
MaxVertexUniformVectors,
PushConstantsAlignment,
ShaderStorageBufferOffsetAlignment,
MaxComputeWorkGroupSizeX,
MaxComputeWorkGroupSizeY,
MaxComputeWorkGroupSizeZ,
MaxComputeWorkGroupInvocations,
MaxVertexInputAttributes,
MaxColorAttachments,
// I-005: Descriptor heap size limits for cross-platform compatibility
MaxDescriptorHeapCbvSrvUav,
MaxDescriptorHeapSamplers,
MaxDescriptorHeapRtvs,
MaxDescriptorHeapDsvs,
};

/**
Expand All @@ -192,7 +216,7 @@ enum class DeviceFeatureLimits {
* Metal Metal API (macOS, iOS, etc.)
* SpirV Standard Portable Intermediate Representation open standard format
*/
enum class ShaderFamily : uint8_t { Unknown, Glsl, GlslEs, Metal, SpirV };
enum class ShaderFamily : uint8_t { Unknown, Glsl, GlslEs, Metal, SpirV, Hlsl };

/**
* @brief ShaderVersion provides information on the shader family type and version
Expand Down
1 change: 1 addition & 0 deletions src/igl/PlatformDevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ enum class PlatformDeviceType {
OpenGLMacOS,
OpenGLWebGL,
Vulkan,
D3D12,
// @fb-only
};

Expand Down
Loading
Loading