Frees entity shader and releases GPU resources (waits for GPU idle, removes from shader map).
Takes shader (shader handle from b3dLoadEntityShader, positive integer).
Returns nothing.
Shaders
Parameters & Returns
Parameters
shaderInt
Returns
Void
Quick Summary
Frees entity shader and releases GPU resources (waits for GPU idle, removes from shader map).
Takes shader (shader handle from b3dLoadEntityShader, positive integer).
Returns nothing.
Technical Exegesis...
Frees entity shader and releases GPU resources (waits for GPU idle, removes from shader map). Takes shader (shader handle from b3dLoadEntityShader, positive integer). Returns nothing. Waits for GPU to finish using shader (calls WaitForIdle to ensure no rendering commands referencing this shader), removes shader from g_entityShaders map (erases entry, releases PSO and bytecode automatically via ComPtr).
Frees entity shader and releases GPU resources (waits for GPU idle, removes from shader map). Takes shader (shader handle from b3dLoadEntityShader, positive integer). Returns nothing. Waits for GPU to finish using shader (calls WaitForIdle to ensure no rendering commands referencing this shader), removes shader from g_entityShaders map (erases entry, releases PSO and bytecode automatically via ComPtr). Use to release shader resources (free memory and GPU objects when shader no longer needed), cleanup on exit (free all shaders before program close), or dynamic shader management (load/free shaders as needed for scene). Free behavior: checks shader exists (looks up in g_entityShaders map, ignores if not found), waits for GPU idle (g_commandListManager->WaitForIdle ensures GPU finished all commands using this shader, prevents use-after-free crashes), removes from map (g_entityShaders.erase, releases EntityShader3D structure), releases PSO (ID3D12PipelineState destroyed automatically via ComPtr, GPU resources freed). Use cases: (1) Cleanup on exit (For Each shader: b3dFreeEntityShader(shader) free all before close), (2) Scene transition (free unused shaders when switching levels, load new ones for next scene), (3) Dynamic effects (load shader for cutscene, free after cutscene ends), (4) Memory management (free old shaders to make room for new ones, prevent accumulation), (5) Error recovery (free failed shader attempts, retry with different file). Common patterns: cleanup = b3dFreeEntityShader(shader) free after use; conditional = If Not usingShader Then b3dFreeEntityShader(shader) free if unused. Typical workflow: load shader (shader = b3dLoadEntityShader("effect.hlsl")), use shader (b3dEntityShader(entity, shader) for frames), free shader (this function when done, releases resources). GPU synchronization: waits for command lists (WaitForIdle on DIRECT queue, ensures all rendering commands submitted to GPU have completed), prevents crashes (freeing shader while GPU using it would crash, wait ensures safe), blocking operation (function doesn't return until GPU idle, may take 1-5ms depending on frame complexity). Shader lifetime: loaded shaders persist (remain in memory until explicitly freed, not automatic cleanup), manual management (user must call FreeEntityShader, engine doesn't auto-free), typical lifetime (load once at start, free once at end, or load/free per scene). GPU resource cleanup: PSO destroyed (ID3D12PipelineState released, GPU state object freed), bytecode cleared (std::vector<BYTE> released, memory freed), map entry removed (g_entityShaders entry erased, slot freed for reuse). Entity cleanup: does NOT clear entities using this shader (entities retain shader handle even after freeing, will render with default shader or possibly crash), user responsibility (call b3dEntityShader(entity, 0) to clear entity's shader before freeing, or ensure entities deleted/updated). Validation: ignores if shader <= 0 (invalid handle, early return), ignores if shader not found (not in g_entityShaders map, silent no-op), safe to call multiple times (freeing already-freed shader harmless, just no-op). No return value: void function (doesn't indicate success/failure), assumes success (shader freed if existed, nothing if didn't), silent operation (no error messages, no confirmation prints). Performance: free cost 1-5ms (GPU WaitForIdle synchronization, blocks until GPU idle), blocking operation (function waits for GPU, don't call during performance-critical rendering), recommend batch freeing (free multiple shaders at once during load screens, not every frame). Related: b3dLoadEntityShader loads shader (creates shader freed by this function), b3dEntityShader assigns shader to entity (should clear entity's shader before freeing shader), b3dGetEntityShader queries entity's shader (check which entities using shader before freeing), b3dSetEntityShaderFloat sets shader parameter (parameters lost when shader freed), b3dSetEntityShaderInt sets shader parameter (parameters lost when shader freed).