diff options
Diffstat (limited to 'src/gpu/texture_manager.cc')
| -rw-r--r-- | src/gpu/texture_manager.cc | 79 |
1 files changed, 58 insertions, 21 deletions
diff --git a/src/gpu/texture_manager.cc b/src/gpu/texture_manager.cc index 7aeb67a..dfa6315 100644 --- a/src/gpu/texture_manager.cc +++ b/src/gpu/texture_manager.cc @@ -21,20 +21,6 @@ void TextureManager::init(WGPUDevice device, WGPUQueue queue) { device_ = device; queue_ = queue; - -#if !defined(STRIP_GPU_COMPOSITE) - // Create linear sampler for composite shaders - WGPUSamplerDescriptor sampler_desc = {}; - sampler_desc.addressModeU = WGPUAddressMode_ClampToEdge; - sampler_desc.addressModeV = WGPUAddressMode_ClampToEdge; - sampler_desc.magFilter = WGPUFilterMode_Linear; - sampler_desc.minFilter = WGPUFilterMode_Linear; - sampler_desc.mipmapFilter = WGPUMipmapFilterMode_Linear; - sampler_desc.lodMinClamp = 0.0f; - sampler_desc.lodMaxClamp = 1.0f; - sampler_desc.maxAnisotropy = 1; - linear_sampler_ = wgpuDeviceCreateSampler(device_, &sampler_desc); -#endif } void TextureManager::shutdown() { @@ -52,10 +38,12 @@ void TextureManager::shutdown() { compute_pipelines_.clear(); #if !defined(STRIP_GPU_COMPOSITE) - if (linear_sampler_) { - wgpuSamplerRelease(linear_sampler_); - linear_sampler_ = nullptr; + for (auto& pair : samplers_) { + if (pair.second) { + wgpuSamplerRelease(pair.second); + } } + samplers_.clear(); #endif } @@ -469,10 +457,58 @@ void TextureManager::create_gpu_grid_texture( } #if !defined(STRIP_GPU_COMPOSITE) +WGPUSampler TextureManager::get_or_create_sampler(SamplerType type) { + auto it = samplers_.find(type); + if (it != samplers_.end()) { + return it->second; + } + + WGPUSamplerDescriptor desc = {}; + desc.lodMinClamp = 0.0f; + desc.lodMaxClamp = 1.0f; + desc.maxAnisotropy = 1; + + switch (type) { + case SamplerType::LinearClamp: + desc.addressModeU = WGPUAddressMode_ClampToEdge; + desc.addressModeV = WGPUAddressMode_ClampToEdge; + desc.magFilter = WGPUFilterMode_Linear; + desc.minFilter = WGPUFilterMode_Linear; + desc.mipmapFilter = WGPUMipmapFilterMode_Linear; + break; + case SamplerType::LinearRepeat: + desc.addressModeU = WGPUAddressMode_Repeat; + desc.addressModeV = WGPUAddressMode_Repeat; + desc.magFilter = WGPUFilterMode_Linear; + desc.minFilter = WGPUFilterMode_Linear; + desc.mipmapFilter = WGPUMipmapFilterMode_Linear; + break; + case SamplerType::NearestClamp: + desc.addressModeU = WGPUAddressMode_ClampToEdge; + desc.addressModeV = WGPUAddressMode_ClampToEdge; + desc.magFilter = WGPUFilterMode_Nearest; + desc.minFilter = WGPUFilterMode_Nearest; + desc.mipmapFilter = WGPUMipmapFilterMode_Nearest; + break; + case SamplerType::NearestRepeat: + desc.addressModeU = WGPUAddressMode_Repeat; + desc.addressModeV = WGPUAddressMode_Repeat; + desc.magFilter = WGPUFilterMode_Nearest; + desc.minFilter = WGPUFilterMode_Nearest; + desc.mipmapFilter = WGPUMipmapFilterMode_Nearest; + break; + } + + WGPUSampler sampler = wgpuDeviceCreateSampler(device_, &desc); + samplers_[type] = sampler; + return sampler; +} + void TextureManager::dispatch_composite( const std::string& func_name, WGPUTexture target, const GpuProceduralParams& params, const void* uniform_data, - size_t uniform_size, const std::vector<WGPUTextureView>& input_views) { + size_t uniform_size, const std::vector<WGPUTextureView>& input_views, + SamplerType sampler_type) { auto it = compute_pipelines_.find(func_name); if (it == compute_pipelines_.end()) { return; // Pipeline not created yet @@ -521,7 +557,7 @@ void TextureManager::dispatch_composite( // Binding N: Sampler if (num_inputs > 0) { bg_entries[2 + num_inputs].binding = 2 + num_inputs; - bg_entries[2 + num_inputs].sampler = linear_sampler_; + bg_entries[2 + num_inputs].sampler = get_or_create_sampler(sampler_type); } // Create bind group layout (must match pipeline) @@ -593,7 +629,8 @@ void TextureManager::dispatch_composite( void TextureManager::create_gpu_composite_texture( const std::string& name, const std::string& shader_func, const char* shader_code, const void* uniform_data, size_t uniform_size, - int width, int height, const std::vector<std::string>& input_names) { + int width, int height, const std::vector<std::string>& input_names, + SamplerType sampler) { // Create pipeline if needed get_or_create_compute_pipeline(shader_func, shader_code, uniform_size, (int)input_names.size()); @@ -625,7 +662,7 @@ void TextureManager::create_gpu_composite_texture( // Dispatch composite shader GpuProceduralParams params = {width, height, nullptr, 0}; dispatch_composite(shader_func, texture, params, uniform_data, uniform_size, - input_views); + input_views, sampler); // Create view WGPUTextureViewDescriptor view_desc = {}; |
