116 lines
5.1 KiB
Markdown
116 lines
5.1 KiB
Markdown
# Plan: RHI Global Context
|
|
|
|
## Goal
|
|
|
|
Replace per-call `WpAllocator *allocator` parameters with a global `PrRhiContext`
|
|
managed by the RHI. The RHI owns the lifetime of all objects it creates.
|
|
|
|
## Changes
|
|
|
|
### 1. `src/prism/rhi/pr_rhi_types.h` — Add context struct
|
|
|
|
Add after the existing typedefs:
|
|
|
|
```c
|
|
typedef struct PrRhiContext {
|
|
WpAllocator main; // objects returned to the user
|
|
WpAllocator scratch; // internal temporaries within functions
|
|
} PrRhiContext;
|
|
```
|
|
|
|
### 2. `src/prism/rhi/pr_rhi.h` — Public API changes
|
|
|
|
- Add `wp_extern PrRhiContext _G_RHI_CONTEXT;` declaration (near top, after includes)
|
|
- Add `wp_extern b8 prRhiInit(void);` and `wp_extern void prRhiDestroy(void);`
|
|
- Remove `WpAllocator *allocator` (and `const WpAllocator *allocator`) from **all** function signatures
|
|
|
|
### 3. `src/prism/rhi/pr_rhi.c` — New file (shared across backends)
|
|
|
|
```c
|
|
#include "pr_rhi.h"
|
|
|
|
PrRhiContext _G_RHI_CONTEXT;
|
|
|
|
b8 prRhiInit(void) {
|
|
_G_RHI_CONTEXT.main = wpMemArenaAllocatorInit(MiB(64));
|
|
_G_RHI_CONTEXT.scratch = wpMemArenaAllocatorInit(MiB(32));
|
|
return true;
|
|
}
|
|
|
|
void prRhiDestroy(void) {
|
|
wpMemAllocatorFree(&_G_RHI_CONTEXT.scratch, ...);
|
|
wpMemAllocatorFree(&_G_RHI_CONTEXT.main, ...);
|
|
}
|
|
```
|
|
|
|
### 4. `src/prism/rhi/vulkan/pr_rhi_vk.h` — Remove allocator from Vk declarations
|
|
|
|
Remove `WpAllocator *allocator` from all function declarations.
|
|
|
|
### 5. `src/prism/rhi/vulkan/pr_rhi_vk.c` — Implementation changes
|
|
|
|
For every function that previously took `WpAllocator *allocator`:
|
|
|
|
- Remove the parameter from the signature
|
|
- Replace `allocator` with `_G_RHI_CONTEXT.main` for:
|
|
- `wpMemAllocatorAlloc(allocator, sizeof(...))` for user-facing objects (returned to caller)
|
|
- `wpArrayAllocCapacity(...)` for arrays that are stored in user-facing structs
|
|
- Replace `allocator` with `_G_RHI_CONTEXT.scratch` for:
|
|
- `wpArrayAllocCapacity(...)` for internal temporary arrays
|
|
- `wpArrayDealloc(...)` for internal temporaries
|
|
- Replace `wpMemAllocatorFree(allocator, ...)` with `wpMemAllocatorFree(&_G_RHI_CONTEXT.main, ...)` for destroy functions
|
|
- Update internal calls (e.g. `prRhiCreateBufferVk` called from `prRhiCreateTextureFromKtxVk`)
|
|
|
|
**Specific internal/helper changes:**
|
|
- `_createSwapchainTexture` — remove `allocator` param, use `_G_RHI_CONTEXT.main`
|
|
- `prRhiCreateTextureFromKtxVk` — staging buffer uses `_G_RHI_CONTEXT.main` (it's a user-facing object destroyed by the user)
|
|
- `prRhiAllocateCommandBuffersVk` — VkCommandBuffer temp array uses scratch, PrRhiCommandBuffer array + structs use main
|
|
- `prRhiCreatePipelineLayoutVk` — VkDescriptorSetLayout/VkPushConstantRange overflow arrays use scratch
|
|
- `prRhiCreateDeviceVk` — VkQueueFamilyProperties2 array uses scratch
|
|
|
|
### 6. `src/prism/rhi/vulkan/pr_rhi_vk_aliases.h` — No changes needed
|
|
|
|
Aliases only map function names, not parameters.
|
|
|
|
## Allocator usage per function
|
|
|
|
| Function | Returned object | Allocator |
|
|
|----------|----------------|-----------|
|
|
| `prRhiCreateInstance` | PrRhiInstance | main |
|
|
| `prRhiDestroyInstance` | — | free from main |
|
|
| `prRhiGetPhysicalDevices` | PrRhiPhysicalDeviceArray + PrRhiPhysicalDevice structs | main |
|
|
| `prRhiCreateSurfaceFromWindow` | PrRhiSurface | main |
|
|
| `prRhiDestroySurface` | — | free from main |
|
|
| `prRhiCreateDevice` | PrRhiDevice | main (internal VkQueueFamilyProperties2 array → scratch) |
|
|
| `prRhiDestroyDevice` | — | free from main |
|
|
| `prRhiCreateSwapchain` | PrRhiSwapchain + images + depth | main (internal VkImage array → scratch) |
|
|
| `prRhiDestroySwapchain` | — | free from main |
|
|
| `prRhiRecreateSwapchain` | updates existing struct | main for new images/depth, scratch for temp arrays |
|
|
| `prRhiCreateBuffer` | PrRhiBuffer | main |
|
|
| `prRhiDestroyBuffer` | — | free from main |
|
|
| `prRhiCreateTexture` | PrRhiTexture | main |
|
|
| `prRhiCreateTextureFromKtx` | PrRhiTexture (staging buffer too) | main |
|
|
| `prRhiDestroyTexture` | — | free from main |
|
|
| `prRhiCreateSampler` | PrRhiSampler | main |
|
|
| `prRhiDestroySampler` | — | free from main |
|
|
| `prRhiCreateShader` | PrRhiShader | main |
|
|
| `prRhiDestroyShader` | — | free from main |
|
|
| `prRhiCreatePipelineLayout` | PrRhiPipelineLayout | main (internal overflow arrays → scratch) |
|
|
| `prRhiDestroyPipelineLayout` | — | free from main |
|
|
| `prRhiCreateGraphicsPipeline` | PrRhiPipeline | main |
|
|
| `prRhiCreateComputePipeline` | PrRhiPipeline | main |
|
|
| `prRhiDestroyPipeline` | — | free from main |
|
|
| `prRhiCreateDescriptorSetLayout` | PrRhiDescriptorSetLayout | main |
|
|
| `prRhiDestroyDescriptorSetLayout` | — | free from main |
|
|
| `prRhiCreateDescriptorPool` | PrRhiDescriptorPool | main |
|
|
| `prRhiDestroyDescriptorPool` | — | free from main |
|
|
| `prRhiAllocateDescriptorSet` | PrRhiDescriptorSet | main |
|
|
| `prRhiFreeDescriptorSet` | — | free from main |
|
|
| `prRhiCreateFence` | PrRhiFence | main |
|
|
| `prRhiDestroyFence` | — | free from main |
|
|
| `prRhiCreateSemaphore` | PrRhiSemaphore | main |
|
|
| `prRhiDestroySemaphore` | — | free from main |
|
|
| `prRhiCreateCommandPool` | PrRhiCommandPool | main |
|
|
| `prRhiDestroyCommandPool` | — | free from main |
|
|
| `prRhiAllocateCommandBuffers` | PrRhiCommandBufferArray + structs | main (internal VkCommandBuffer array → scratch) |
|