/*
Crafter®.Graphics
Copyright (C) 2026 Catcrafts®
catcrafts.net
*/

module Crafter.Graphics:WebGPUComputeShader_impl;
import :WebGPUComputeShader;
import :WebGPU;
import std;

using namespace Crafter;

void WebGPUComputeShader::Load(std::string_view wgsl,
                               std::span<const UICustomBinding> bindings,
                               bool rayQuery) {
    customBindings.assign(bindings.begin(), bindings.end());
    rayQueryCapable = rayQuery;
    pipelineHandle = WebGPU::wgpuLoadCustomShader(
        wgsl.data(),
        static_cast<std::int32_t>(wgsl.size()),
        customBindings.data(),
        static_cast<std::int32_t>(customBindings.size()),
        rayQuery ? 1 : 0
    );
}

void WebGPUComputeShader::Load(const std::filesystem::path& wgslPath,
                               std::span<const UICustomBinding> bindings,
                               bool rayQuery) {
    std::ifstream f(wgslPath, std::ios::binary | std::ios::ate);
    if (!f.is_open()) {
        std::println("WebGPUComputeShader::Load: cannot open {}", wgslPath.string());
        return;
    }
    auto size = f.tellg();
    if (size <= 0) {
        std::println("WebGPUComputeShader::Load: empty file {}", wgslPath.string());
        return;
    }
    f.seekg(0, std::ios::beg);
    std::string src(static_cast<std::size_t>(size), '\0');
    f.read(src.data(), size);
    Load(std::string_view{src}, bindings, rayQuery);
}
