// Copyright 2024 The Ebitengine Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package shaderprecomp import ( "io" "github.com/hajimehoshi/ebiten/v2/internal/graphics" "github.com/hajimehoshi/ebiten/v2/internal/graphicsdriver/directx" "github.com/hajimehoshi/ebiten/v2/internal/shaderir" "github.com/hajimehoshi/ebiten/v2/internal/shaderir/hlsl" ) const ( // HLSLVertexShaderProfile is the target profile for vertex shaders. HLSLVertexShaderProfile = directx.VertexShaderProfile // HLSLPixelShaderProfile is the target profile for pixel shaders. HLSLPixelShaderProfile = directx.PixelShaderProfile // HLSLVertexShaderEntryPoint is the entry point name for vertex shaders. HLSLVertexShaderEntryPoint = directx.VertexShaderEntryPoint // HLSLPixelShaderEntryPoint is the entry point name for pixel shaders. HLSLPixelShaderEntryPoint = directx.PixelShaderEntryPoint ) // CompileToHLSL compiles the shader source to High-Level Shader Language to writers. // // CompileToHLSL is concurrent-safe. func CompileToHLSL(vertexWriter, pixelWriter io.Writer, source *ShaderSource) error { ir, err := graphics.CompileShader(source.source) if err != nil { return err } vs, ps := hlsl.Compile(ir) if _, err = vertexWriter.Write([]byte(vs)); err != nil { return err } if _, err = pixelWriter.Write([]byte(ps)); err != nil { return err } return nil } // RegisterFXCs registers a precompiled HLSL (FXC) for a shader source. // vertexFXC and pixelFXC must be the content of .fxc files generated by `fxc` command. // For more details, see https://learn.microsoft.com/en-us/windows/win32/direct3dtools/dx-graphics-tools-fxc-using. // // RegisterFXCs is concurrent-safe. func RegisterFXCs(source *ShaderSource, vertexFXC, pixelFXC []byte) { directx.RegisterPrecompiledFXCs(shaderir.SourceHash(source.ID()), vertexFXC, pixelFXC) }