redo presentation queue waiting

This commit is contained in:
Greg Wells
2025-07-11 14:02:55 -04:00
parent 04a19fce18
commit 2def510f69
5 changed files with 52 additions and 12 deletions

View File

@@ -5,12 +5,22 @@
typedef id<MTLTexture> metalTexture;
GN_ARRAY_LIST(metalTexture);
typedef struct mtlImageNeeded {
gnSemaphore semaphoreToSignal;
uint32_t* whereToPut;
} mtlImageNeeded;
GN_ARRAY_LIST(mtlImageNeeded);
typedef struct gnPlatformPresentationQueue_t {
metalTextureArrayList textures;
uint32_tArrayList avaliableTextures;
mtlImageNeededArrayList neededImages;
} gnPlatformPresentationQueue;
gnReturnCode createMetalPresentationQueue(gnPresentationQueueHandle presentationQueue, const gnDevice device, gnPresentationQueueInfo presentationInfo);
gnReturnCode getMetalPresentQueueImageAsync(gnPresentationQueueHandle presentationQueue, uint64_t timeout, gnSemaphore semaphore, uint32_t* imageIndex);
gnReturnCode getMetalPresentQueueImage(gnPresentationQueueHandle presentationQueue, uint32_t* imageIndex);
void destroyMetalPresentationQueue(gnPresentationQueueHandle presentationQueue);
void mtlAddImageBackToQueue(gnPresentationQueue queue, uint32_t index);

View File

@@ -48,18 +48,35 @@ gnReturnCode createMetalPresentationQueue(gnPresentationQueueHandle presentation
return GN_SUCCESS;
}
void mtlTakeImageFromQueue(uint32_t* whereToPut, gnPresentationQueue queue, gnSemaphore semaphore) {
*whereToPut = queue->presentationQueue->avaliableTextures.data[0];
uint32_tArrayListPopHead(&queue->presentationQueue->avaliableTextures);
if (semaphore) semaphore->semaphore->eventTriggered = gnTrue;
}
void mtlAddImageBackToQueue(gnPresentationQueue queue, uint32_t index) {
if (queue->presentationQueue->neededImages.count > 0)
mtlTakeImageFromQueue(queue->presentationQueue->neededImages.data[queue->presentationQueue->neededImages.count - 1].whereToPut, queue, queue->presentationQueue->neededImages.data[queue->presentationQueue->neededImages.count - 1].semaphoreToSignal);
else
uint32_tArrayListAdd(&queue->presentationQueue->avaliableTextures, index);
}
gnReturnCode getMetalPresentQueueImageAsync(gnPresentationQueueHandle presentationQueue, uint64_t timeout, gnSemaphore semaphore, uint32_t* imageIndex) {
while (presentationQueue->presentationQueue->avaliableTextures.count == 0) {}
*imageIndex = presentationQueue->presentationQueue->avaliableTextures.data[0];
uint32_tArrayListPopHead(&presentationQueue->presentationQueue->avaliableTextures);
semaphore->semaphore->eventTriggered = gnTrue;
if (presentationQueue->presentationQueue->avaliableTextures.count == 0) {
mtlImageNeeded image = {
.semaphoreToSignal = semaphore,
.whereToPut = imageIndex
};
mtlImageNeededArrayListAdd(&presentationQueue->presentationQueue->neededImages, image);
} else {
mtlTakeImageFromQueue(imageIndex, presentationQueue, semaphore);
}
return GN_SUCCESS;
}
gnReturnCode getMetalPresentQueueImage(gnPresentationQueueHandle presentationQueue, uint32_t* imageIndex) {
while (presentationQueue->presentationQueue->avaliableTextures.count == 0) {}
*imageIndex = presentationQueue->presentationQueue->avaliableTextures.data[0];
uint32_tArrayListPopHead(&presentationQueue->presentationQueue->avaliableTextures);
mtlTakeImageFromQueue(imageIndex, presentationQueue, NULL);
return GN_SUCCESS;
}