您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 
 

210 行
11 KiB

// Unity Native Plugin API copyright © 2015 Unity Technologies ApS
//
// Licensed under the Unity Companion License for Unity - dependent projects--see[Unity Companion License](http://www.unity3d.com/legal/licenses/Unity_Companion_License).
//
// Unless expressly provided otherwise, the Software under this license is made available strictly on an “AS IS” BASIS WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED.Please review the license for details on these and other terms and conditions.
#pragma once
#include "IUnityGraphics.h"
/*
Low-level Native Plugin Shader Compiler Access
==============================================
On top of the Low-level native plugin interface, Unity also supports low level access to the shader compiler, allowing the user to inject different variants into a shader.
It is also an event driven approach in which the plugin will receive callbacks when certain builtin events happen.
*/
enum UnityShaderCompilerExtCompilerPlatform
{
kUnityShaderCompilerExtCompPlatformUnused0 = 0,
kUnityShaderCompilerExtCompPlatformUnused1,
kUnityShaderCompilerExtCompPlatformUnused2,
kUnityShaderCompilerExtCompPlatformUnused3,
kUnityShaderCompilerExtCompPlatformD3D11, // Direct3D 11 (FL10.0 and up), compiled with MS D3DCompiler
kUnityShaderCompilerExtCompPlatformGLES20, // OpenGL ES 2.0 / WebGL 1.0, compiled with MS D3DCompiler + HLSLcc
kUnityShaderCompilerExtCompPlatformUnused6,
kUnityShaderCompilerExtCompPlatformUnused7,
kUnityShaderCompilerExtCompPlatformUnused8,
kUnityShaderCompilerExtCompPlatformGLES3Plus, // OpenGL ES 3.0+ / WebGL 2.0, compiled with MS D3DCompiler + HLSLcc
kUnityShaderCompilerExtCompPlatformUnused10,
kUnityShaderCompilerExtCompPlatformPS4, // Sony PS4
kUnityShaderCompilerExtCompPlatformXboxOne, // MS XboxOne
kUnityShaderCompilerExtCompPlatformUnused13,
kUnityShaderCompilerExtCompPlatformMetal, // Apple Metal, compiled with MS D3DCompiler + HLSLcc
kUnityShaderCompilerExtCompPlatformOpenGLCore, // Desktop OpenGL 3+, compiled with MS D3DCompiler + HLSLcc
kUnityShaderCompilerExtCompPlatformUnused16,
kUnityShaderCompilerExtCompPlatformUnused17,
kUnityShaderCompilerExtCompPlatformVulkan, // Vulkan SPIR-V, compiled with MS D3DCompiler + HLSLcc
kUnityShaderCompilerExtCompPlatformSwitch, // Nintendo Switch (NVN)
kUnityShaderCompilerExtCompPlatformXboxOneD3D12, // Xbox One D3D12
kUnityShaderCompilerExtCompPlatformCount
};
enum UnityShaderCompilerExtShaderType
{
kUnityShaderCompilerExtShaderNone = 0,
kUnityShaderCompilerExtShaderVertex = 1,
kUnityShaderCompilerExtShaderFragment = 2,
kUnityShaderCompilerExtShaderGeometry = 3,
kUnityShaderCompilerExtShaderHull = 4,
kUnityShaderCompilerExtShaderDomain = 5,
kUnityShaderCompilerExtShaderRayTracing = 6,
kUnityShaderCompilerExtShaderTypeCount // keep this last!
};
enum UnityShaderCompilerExtGPUProgramType
{
kUnityShaderCompilerExtGPUProgramTargetUnknown = 0,
kUnityShaderCompilerExtGPUProgramTargetGLLegacy = 1, // removed
kUnityShaderCompilerExtGPUProgramTargetGLES31AEP = 2,
kUnityShaderCompilerExtGPUProgramTargetGLES31 = 3,
kUnityShaderCompilerExtGPUProgramTargetGLES3 = 4,
kUnityShaderCompilerExtGPUProgramTargetGLES = 5,
kUnityShaderCompilerExtGPUProgramTargetGLCore32 = 6,
kUnityShaderCompilerExtGPUProgramTargetGLCore41 = 7,
kUnityShaderCompilerExtGPUProgramTargetGLCore43 = 8,
kUnityShaderCompilerExtGPUProgramTargetDX9VertexSM20 = 9, // removed
kUnityShaderCompilerExtGPUProgramTargetDX9VertexSM30 = 10, // removed
kUnityShaderCompilerExtGPUProgramTargetDX9PixelSM20 = 11, // removed
kUnityShaderCompilerExtGPUProgramTargetDX9PixelSM30 = 12, // removed
kUnityShaderCompilerExtGPUProgramTargetDX10Level9Vertex = 13,
kUnityShaderCompilerExtGPUProgramTargetDX10Level9Pixel = 14,
kUnityShaderCompilerExtGPUProgramTargetDX11VertexSM40 = 15,
kUnityShaderCompilerExtGPUProgramTargetDX11VertexSM50 = 16,
kUnityShaderCompilerExtGPUProgramTargetDX11PixelSM40 = 17,
kUnityShaderCompilerExtGPUProgramTargetDX11PixelSM50 = 18,
kUnityShaderCompilerExtGPUProgramTargetDX11GeometrySM40 = 19,
kUnityShaderCompilerExtGPUProgramTargetDX11GeometrySM50 = 20,
kUnityShaderCompilerExtGPUProgramTargetDX11HullSM50 = 21,
kUnityShaderCompilerExtGPUProgramTargetDX11DomainSM50 = 22,
kUnityShaderCompilerExtGPUProgramTargetMetalVS = 23,
kUnityShaderCompilerExtGPUProgramTargetMetalFS = 24,
kUnityShaderCompilerExtGPUProgramTargetSPIRV = 25,
kUnityShaderCompilerExtGPUProgramTargetUnused1 = 26,
kUnityShaderCompilerExtGPUProgramTargetUnused2 = 27,
kUnityShaderCompilerExtGPUProgramTargetUnused3 = 28,
kUnityShaderCompilerExtGPUProgramTargetUnused4 = 29,
kUnityShaderCompilerExtGPUProgramTargetUnused5 = 30,
kUnityShaderCompilerExtGPUProgramTargetRayTracing = 31,
kUnityShaderCompilerExtGPUProgramTargetCount
};
enum UnityShaderCompilerExtGPUProgram
{
kUnityShaderCompilerExtGPUProgramVS = 1 << kUnityShaderCompilerExtShaderVertex,
kUnityShaderCompilerExtGPUProgramPS = 1 << kUnityShaderCompilerExtShaderFragment,
kUnityShaderCompilerExtGPUProgramGS = 1 << kUnityShaderCompilerExtShaderGeometry,
kUnityShaderCompilerExtGPUProgramHS = 1 << kUnityShaderCompilerExtShaderHull,
kUnityShaderCompilerExtGPUProgramDS = 1 << kUnityShaderCompilerExtShaderDomain,
kUnityShaderCompilerExtGPUProgramCustom = 1 << kUnityShaderCompilerExtShaderTypeCount
};
enum UnityShaderCompilerExtEventType
{
kUnityShaderCompilerExtEventCreateCustomSourceVariant, // The plugin can create a new variant based on the initial snippet. The callback will receive UnityShaderCompilerExtCustomSourceVariantParams as data.
kUnityShaderCompilerExtEventCreateCustomSourceVariantCleanup, // Typically received after the kUnityShaderCompilerExtEventCreateCustomVariant event so the plugin has a chance to cleanup after itself. (outputSnippet & outputKeyword)
kUnityShaderCompilerExtEventCreateCustomBinaryVariant, // The plugin can create a new variant based on the initial snippet. The callback will receive UnityShaderCompilerExtCustomBinaryVariantParams as data.
kUnityShaderCompilerExtEventCreateCustomBinaryVariantCleanup, // Typically received after the kUnityShaderCompilerExtEventCreateCustomVariant event so the plugin has a chance to cleanup after itself. (outputSnippet & outputKeyword)
kUnityShaderCompilerExtEventPluginConfigure, // Event sent so the plugin can configure itself. It receives IUnityShaderCompilerExtPluginConfigure* as data
// keep these last
kUnityShaderCompilerExtEventCount,
kUnityShaderCompilerExtUserEventsStart = kUnityShaderCompilerExtEventCount
};
struct UnityShaderCompilerExtCustomSourceVariantParams
{
char* outputSnippet; // snippet after the plugin has finished processing it.
char* outputKeywords; // keywords exported by the plugin for this specific variant
const char* inputSnippet; // the source shader snippet
bool vr; // is VR enabled / supported ?
UnityShaderCompilerExtCompilerPlatform platform; // compiler platform
UnityShaderCompilerExtShaderType shaderType; // source code type
};
struct UnityShaderCompilerExtCustomBinaryVariantParams
{
void** outputBinaryShader; // output of the plugin generated binary shader (platform dependent)
const unsigned char* inputByteCode; // the shader byteCode (platform dependent)
unsigned int inputByteCodeSize; // shader bytecode size
unsigned int programTypeMask; // a mask of UnityShaderCompilerExtGPUProgram values
UnityShaderCompilerExtCompilerPlatform platform; // compiler platform
};
/*
This class is queried by unity to get information about the plugin.
The plugin has to set all the relevant values during the kUnityShaderCompilerExtEventPluginConfigure event.
<code>
extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API
UnityShaderCompilerExtEvent(UnityShaderCompilerExtEventType event, void* data)
{
switch (event)
{
...
case kUnityShaderCompilerExtEventPluginConfigure:
{
unsigned int GPUCompilerMask = (1 << kUnityShaderCompilerExtGPUProgramTargetDX11VertexSM40)
| (1 << kUnityShaderCompilerExtGPUProgramTargetDX11VertexSM50)
| (1 << kUnityShaderCompilerExtGPUProgramTargetDX11PixelSM40)
| (1 << kUnityShaderCompilerExtGPUProgramTargetDX11PixelSM50)
| (1 << kUnityShaderCompilerExtGPUProgramTargetDX11GeometrySM40)
| (1 << kUnityShaderCompilerExtGPUProgramTargetDX11GeometrySM50)
| (1 << kUnityShaderCompilerExtGPUProgramTargetDX11HullSM50)
| (1 << kUnityShaderCompilerExtGPUProgramTargetDX11DomainSM50);
unsigned int ShaderMask = kUnityShaderCompilerExtGPUProgramVS | kUnityShaderCompilerExtGPUProgramDS;
IUnityShaderCompilerExtPluginConfigure* pluginConfig = (IUnityShaderCompilerExtPluginConfigure*)data;
pluginConfig->ReserveKeyword(SHADER_KEYWORDS);
pluginConfig->SetGPUProgramCompilerMask(GPUCompilerMask);
pluginConfig->SetShaderProgramMask(ShaderMask);
break;
}
}
}
</code>
*/
class IUnityShaderCompilerExtPluginConfigure
{
public:
virtual ~IUnityShaderCompilerExtPluginConfigure() {}
virtual void ReserveKeyword(const char* keyword) = 0; // Allow the plugin to reserve its keyword so unity can include it in calculating the variants
virtual void SetGPUProgramCompilerMask(unsigned int mask) = 0; // Specifies a bit mask of UnityShaderCompilerExtGPUProgramType programs the plugin supports compiling
virtual void SetShaderProgramMask(unsigned int mask) = 0; // Specifies a bit mask of UnityShaderCompilerExtGPUProgram programs the plugin supports compiling
};
// Interface to help setup / configure both unity and the plugin.
#ifdef __cplusplus
extern "C" {
#endif
// If exported by a plugin, this function will be called for all the events in UnityShaderCompilerExtEventType
void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API UnityShaderCompilerExtEvent(UnityShaderCompilerExtEventType event, void* data);
#ifdef __cplusplus
}
#endif