mirror of https://github.com/libsdl-org/SDL
GPU: Metal vertex buffer indices should grow upward (#10837)
This commit is contained in:
parent
0548050fc5
commit
4f722d372a
|
@ -1983,7 +1983,7 @@ extern SDL_DECLSPEC SDL_GPUSampler *SDLCALL SDL_CreateGPUSampler(
|
||||||
* - [[texture]]: Sampled textures, followed by storage textures
|
* - [[texture]]: Sampled textures, followed by storage textures
|
||||||
* - [[sampler]]: Samplers with indices corresponding to the sampled textures
|
* - [[sampler]]: Samplers with indices corresponding to the sampled textures
|
||||||
* - [[buffer]]: Uniform buffers, followed by storage buffers. Vertex buffer 0
|
* - [[buffer]]: Uniform buffers, followed by storage buffers. Vertex buffer 0
|
||||||
* is bound at [[buffer(30)]], vertex buffer 1 at [[buffer(29)]], and so on.
|
* is bound at [[buffer(14)]], vertex buffer 1 at [[buffer(15)]], and so on.
|
||||||
* Rather than manually authoring vertex buffer indices, use the
|
* Rather than manually authoring vertex buffer indices, use the
|
||||||
* [[stage_in]] attribute which will automatically use the vertex input
|
* [[stage_in]] attribute which will automatically use the vertex input
|
||||||
* information from the SDL_GPUPipeline.
|
* information from the SDL_GPUPipeline.
|
||||||
|
|
|
@ -30,9 +30,9 @@
|
||||||
|
|
||||||
// Defines
|
// Defines
|
||||||
|
|
||||||
#define METAL_MAX_BUFFER_COUNT 31
|
#define METAL_FIRST_VERTEX_BUFFER_SLOT 14
|
||||||
#define WINDOW_PROPERTY_DATA "SDL_GPUMetalWindowPropertyData"
|
#define WINDOW_PROPERTY_DATA "SDL_GPUMetalWindowPropertyData"
|
||||||
#define SDL_GPU_SHADERSTAGE_COMPUTE 2
|
#define SDL_GPU_SHADERSTAGE_COMPUTE 2
|
||||||
|
|
||||||
#define TRACK_RESOURCE(resource, type, array, count, capacity) \
|
#define TRACK_RESOURCE(resource, type, array, count, capacity) \
|
||||||
Uint32 i; \
|
Uint32 i; \
|
||||||
|
@ -633,11 +633,6 @@ struct MetalRenderer
|
||||||
|
|
||||||
// Helper Functions
|
// Helper Functions
|
||||||
|
|
||||||
static Uint32 METAL_INTERNAL_GetVertexBufferIndex(Uint32 binding)
|
|
||||||
{
|
|
||||||
return METAL_MAX_BUFFER_COUNT - 1 - binding;
|
|
||||||
}
|
|
||||||
|
|
||||||
// FIXME: This should be moved into SDL_sysgpu.h
|
// FIXME: This should be moved into SDL_sysgpu.h
|
||||||
static inline Uint32 METAL_INTERNAL_NextHighestAlignment(
|
static inline Uint32 METAL_INTERNAL_NextHighestAlignment(
|
||||||
Uint32 n,
|
Uint32 n,
|
||||||
|
@ -1097,11 +1092,12 @@ static SDL_GPUGraphicsPipeline *METAL_CreateGraphicsPipeline(
|
||||||
Uint32 loc = createinfo->vertex_input_state.vertex_attributes[i].location;
|
Uint32 loc = createinfo->vertex_input_state.vertex_attributes[i].location;
|
||||||
vertexDescriptor.attributes[loc].format = SDLToMetal_VertexFormat[createinfo->vertex_input_state.vertex_attributes[i].format];
|
vertexDescriptor.attributes[loc].format = SDLToMetal_VertexFormat[createinfo->vertex_input_state.vertex_attributes[i].format];
|
||||||
vertexDescriptor.attributes[loc].offset = createinfo->vertex_input_state.vertex_attributes[i].offset;
|
vertexDescriptor.attributes[loc].offset = createinfo->vertex_input_state.vertex_attributes[i].offset;
|
||||||
vertexDescriptor.attributes[loc].bufferIndex = METAL_INTERNAL_GetVertexBufferIndex(createinfo->vertex_input_state.vertex_attributes[i].buffer_slot);
|
vertexDescriptor.attributes[loc].bufferIndex =
|
||||||
|
METAL_FIRST_VERTEX_BUFFER_SLOT + createinfo->vertex_input_state.vertex_attributes[i].buffer_slot;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Uint32 i = 0; i < createinfo->vertex_input_state.num_vertex_buffers; i += 1) {
|
for (Uint32 i = 0; i < createinfo->vertex_input_state.num_vertex_buffers; i += 1) {
|
||||||
binding = METAL_INTERNAL_GetVertexBufferIndex(createinfo->vertex_input_state.vertex_buffer_descriptions[i].slot);
|
binding = METAL_FIRST_VERTEX_BUFFER_SLOT + createinfo->vertex_input_state.vertex_buffer_descriptions[i].slot;
|
||||||
vertexDescriptor.layouts[binding].stepFunction = SDLToMetal_StepFunction[createinfo->vertex_input_state.vertex_buffer_descriptions[i].input_rate];
|
vertexDescriptor.layouts[binding].stepFunction = SDLToMetal_StepFunction[createinfo->vertex_input_state.vertex_buffer_descriptions[i].input_rate];
|
||||||
vertexDescriptor.layouts[binding].stepRate = (createinfo->vertex_input_state.vertex_buffer_descriptions[i].input_rate == SDL_GPU_VERTEXINPUTRATE_INSTANCE)
|
vertexDescriptor.layouts[binding].stepRate = (createinfo->vertex_input_state.vertex_buffer_descriptions[i].input_rate == SDL_GPU_VERTEXINPUTRATE_INSTANCE)
|
||||||
? createinfo->vertex_input_state.vertex_buffer_descriptions[i].instance_step_rate
|
? createinfo->vertex_input_state.vertex_buffer_descriptions[i].instance_step_rate
|
||||||
|
@ -2371,17 +2367,16 @@ static void METAL_BindVertexBuffers(
|
||||||
MetalCommandBuffer *metalCommandBuffer = (MetalCommandBuffer *)commandBuffer;
|
MetalCommandBuffer *metalCommandBuffer = (MetalCommandBuffer *)commandBuffer;
|
||||||
id<MTLBuffer> metalBuffers[MAX_VERTEX_BUFFERS];
|
id<MTLBuffer> metalBuffers[MAX_VERTEX_BUFFERS];
|
||||||
NSUInteger bufferOffsets[MAX_VERTEX_BUFFERS];
|
NSUInteger bufferOffsets[MAX_VERTEX_BUFFERS];
|
||||||
NSRange range = NSMakeRange(METAL_INTERNAL_GetVertexBufferIndex(firstBinding), numBindings);
|
NSRange range = NSMakeRange(METAL_FIRST_VERTEX_BUFFER_SLOT + firstBinding, numBindings);
|
||||||
|
|
||||||
if (range.length == 0) {
|
if (range.length == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Uint32 i = 0; i < range.length; i += 1) {
|
for (Uint32 i = 0; i < numBindings; i += 1) {
|
||||||
MetalBuffer *currentBuffer = ((MetalBufferContainer *)bindings[i].buffer)->activeBuffer;
|
MetalBuffer *currentBuffer = ((MetalBufferContainer *)bindings[i].buffer)->activeBuffer;
|
||||||
NSUInteger bindingIndex = range.length - 1 - i;
|
metalBuffers[firstBinding + i] = currentBuffer->handle;
|
||||||
metalBuffers[bindingIndex] = currentBuffer->handle;
|
bufferOffsets[firstBinding + i] = bindings[i].offset;
|
||||||
bufferOffsets[bindingIndex] = bindings[i].offset;
|
|
||||||
METAL_INTERNAL_TrackBuffer(metalCommandBuffer, currentBuffer);
|
METAL_INTERNAL_TrackBuffer(metalCommandBuffer, currentBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue