167 lines
8.0 KiB
Ruby
167 lines
8.0 KiB
Ruby
# -*- coding: utf-8 -*- #
|
|
# frozen_string_literal: true
|
|
|
|
module Rouge
|
|
module Lexers
|
|
load_lexer 'c.rb'
|
|
|
|
class HLSL < C
|
|
title "HLSL"
|
|
desc "HLSL, the High Level Shading Language for DirectX (docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl)"
|
|
tag 'hlsl'
|
|
filenames '*.hlsl', '*.hlsli'
|
|
mimetypes 'text/x-hlsl'
|
|
|
|
def self.keywords
|
|
@keywords ||= Set.new %w(
|
|
asm asm_fragment break case cbuffer centroid class column_major
|
|
compile compile_fragment const continue default discard do else export
|
|
extern for fxgroup globallycoherent groupshared if in inline inout
|
|
interface line lineadj linear namespace nointerpolation noperspective
|
|
NULL out packoffset pass pixelfragment point precise return register
|
|
row_major sample sampler shared stateblock stateblock_state static
|
|
struct switch tbuffer technique technique10 technique11 texture
|
|
typedef triangle uniform vertexfragment volatile while
|
|
)
|
|
end
|
|
|
|
def self.keywords_type
|
|
@keywords_type ||= Set.new %w(
|
|
dword matrix snorm string unorm unsigned void vector BlendState Buffer
|
|
ByteAddressBuffer ComputeShader DepthStencilState DepthStencilView
|
|
DomainShader GeometryShader HullShader InputPatch LineStream
|
|
OutputPatch PixelShader PointStream RasterizerState RenderTargetView
|
|
RasterizerOrderedBuffer RasterizerOrderedByteAddressBuffer
|
|
RasterizerOrderedStructuredBuffer RasterizerOrderedTexture1D
|
|
RasterizerOrderedTexture1DArray RasterizerOrderedTexture2D
|
|
RasterizerOrderedTexture2DArray RasterizerOrderedTexture3D RWBuffer
|
|
RWByteAddressBuffer RWStructuredBuffer RWTexture1D RWTexture1DArray
|
|
RWTexture2D RWTexture2DArray RWTexture3D SamplerState
|
|
SamplerComparisonState StructuredBuffer Texture1D Texture1DArray
|
|
Texture2D Texture2DArray Texture2DMS Texture2DMSArray Texture3D
|
|
TextureCube TextureCubeArray TriangleStream VertexShader
|
|
|
|
bool1 bool2 bool3 bool4 BOOL1 BOOL2 BOOL3 BOOL4
|
|
int1 int2 int3 int4
|
|
half1 half2 half3 half4
|
|
float1 float2 float3 float4
|
|
double1 double2 double3 double4
|
|
|
|
bool1x1 bool1x2 bool1x3 bool1x4 bool2x1 bool2x2 bool2x3 bool2x4
|
|
bool3x1 bool3x2 bool3x3 bool3x4 bool4x1 bool4x2 bool4x3 bool4x4
|
|
BOOL1x1 BOOL1x2 BOOL1x3 BOOL1x4 BOOL2x1 BOOL2x2 BOOL2x3 BOOL2x4
|
|
BOOL3x1 BOOL3x2 BOOL3x3 BOOL3x4 BOOL4x1 BOOL4x2 BOOL4x3 BOOL4x4
|
|
half1x1 half1x2 half1x3 half1x4 half2x1 half2x2 half2x3 half2x4
|
|
half3x1 half3x2 half3x3 half3x4 half4x1 half4x2 half4x3 half4x4
|
|
int1x1 int1x2 int1x3 int1x4 int2x1 int2x2 int2x3 int2x4
|
|
int3x1 int3x2 int3x3 int3x4 int4x1 int4x2 int4x3 int4x4
|
|
float1x1 float1x2 float1x3 float1x4 float2x1 float2x2 float2x3 float2x4
|
|
float3x1 float3x2 float3x3 float3x4 float4x1 float4x2 float4x3 float4x4
|
|
double1x1 double1x2 double1x3 double1x4 double2x1 double2x2 double2x3 double2x4
|
|
double3x1 double3x2 double3x3 double3x4 double4x1 double4x2 double4x3 double4x4
|
|
)
|
|
end
|
|
|
|
def self.reserved
|
|
@reserved ||= Set.new %w(
|
|
auto catch char const_cast delete dynamic_cast enum explicit friend
|
|
goto long mutable new operator private protected public
|
|
reinterpret_cast short signed sizeof static_cast template this throw
|
|
try typename union unsigned using virtual
|
|
)
|
|
end
|
|
|
|
def self.builtins
|
|
@builtins ||= Set.new %w(
|
|
abort abs acos all AllMemoryBarrier AllMemoryBarrierWithGroupSync any
|
|
AppendStructuredBuffer asdouble asfloat asin asint asuint asuint atan
|
|
atan2 ceil CheckAccessFullyMapped clamp clip CompileShader
|
|
ConsumeStructuredBuffer cos cosh countbits cross D3DCOLORtoUBYTE4 ddx
|
|
ddx_coarse ddx_fine ddy ddy_coarse ddy_fine degrees determinant
|
|
DeviceMemoryBarrier DeviceMemoryBarrierWithGroupSync distance dot dst
|
|
errorf EvaluateAttributeAtCentroid EvaluateAttributeAtSample
|
|
EvaluateAttributeSnapped exp exp2 f16tof32 f32tof16 faceforward
|
|
firstbithigh firstbitlow floor fma fmod frac frexp fwidth
|
|
GetRenderTargetSampleCount GetRenderTargetSamplePosition
|
|
GlobalOrderedCountIncrement GroupMemoryBarrier
|
|
GroupMemoryBarrierWithGroupSync InterlockedAdd InterlockedAnd
|
|
InterlockedCompareExchange InterlockedCompareStore InterlockedExchange
|
|
InterlockedMax InterlockedMin InterlockedOr InterlockedXor isfinite
|
|
isinf isnan ldexp length lerp lit log log10 log2 mad max min modf
|
|
msad4 mul noise normalize pow printf Process2DQuadTessFactorsAvg
|
|
Process2DQuadTessFactorsMax Process2DQuadTessFactorsMin
|
|
ProcessIsolineTessFactors ProcessQuadTessFactorsAvg
|
|
ProcessQuadTessFactorsMax ProcessQuadTessFactorsMin
|
|
ProcessTriTessFactorsAvg ProcessTriTessFactorsMax
|
|
ProcessTriTessFactorsMin QuadReadLaneAt QuadSwapX QuadSwapY radians
|
|
rcp reflect refract reversebits round rsqrt saturate sign sin sincos
|
|
sinh smoothstep sqrt step tan tanh tex1D tex1D tex1Dbias tex1Dgrad
|
|
tex1Dlod tex1Dproj tex2D tex2D tex2Dbias tex2Dgrad tex2Dlod tex2Dproj
|
|
tex3D tex3D tex3Dbias tex3Dgrad tex3Dlod tex3Dproj texCUBE texCUBE
|
|
texCUBEbias texCUBEgrad texCUBElod texCUBEproj transpose trunc
|
|
WaveAllBitAnd WaveAllMax WaveAllMin WaveAllBitOr WaveAllBitXor
|
|
WaveAllEqual WaveAllProduct WaveAllSum WaveAllTrue WaveAnyTrue
|
|
WaveBallot WaveGetLaneCount WaveGetLaneIndex WaveGetOrderedIndex
|
|
WaveIsHelperLane WaveOnce WavePrefixProduct WavePrefixSum
|
|
WaveReadFirstLane WaveReadLaneAt
|
|
|
|
SV_CLIPDISTANCE SV_CLIPDISTANCE0 SV_CLIPDISTANCE1 SV_CULLDISTANCE
|
|
SV_CULLDISTANCE0 SV_CULLDISTANCE1 SV_COVERAGE SV_DEPTH
|
|
SV_DEPTHGREATEREQUAL SV_DEPTHLESSEQUAL SV_DISPATCHTHREADID
|
|
SV_DOMAINLOCATION SV_GROUPID SV_GROUPINDEX SV_GROUPTHREADID
|
|
SV_GSINSTANCEID SV_INNERCOVERAGE SV_INSIDETESSFACTOR SV_INSTANCEID
|
|
SV_ISFRONTFACE SV_OUTPUTCONTROLPOINTID SV_POSITION SV_PRIMITIVEID
|
|
SV_RENDERTARGETARRAYINDEX SV_SAMPLEINDEX SV_STENCILREF SV_TESSFACTOR
|
|
SV_VERTEXID SV_VIEWPORTARRAYINDEX
|
|
|
|
allow_uav_condition branch call domain earlydepthstencil fastopt
|
|
flatten forcecase instance loop maxtessfactor numthreads
|
|
outputcontrolpoints outputtopology partitioning patchconstantfunc
|
|
unroll
|
|
|
|
BINORMAL BINORMAL0 BINORMAL1 BINORMAL2 BINORMAL3 BINORMAL4
|
|
BLENDINDICES0 BLENDINDICES1 BLENDINDICES2 BLENDINDICES3 BLENDINDICES4
|
|
BLENDWEIGHT0 BLENDWEIGHT1 BLENDWEIGHT2 BLENDWEIGHT3 BLENDWEIGHT4 COLOR
|
|
COLOR0 COLOR1 COLOR2 COLOR3 COLOR4 NORMAL NORMAL0 NORMAL1 NORMAL2
|
|
NORMAL3 NORMAL4 POSITION POSITION0 POSITION1 POSITION2 POSITION3
|
|
POSITION4 POSITIONT PSIZE0 PSIZE1 PSIZE2 PSIZE3 PSIZE4 TANGENT
|
|
TANGENT0 TANGENT1 TANGENT2 TANGENT3 TANGENT4 TESSFACTOR0 TESSFACTOR1
|
|
TESSFACTOR2 TESSFACTOR3 TESSFACTOR4 TEXCOORD0 TEXCOORD1 TEXCOORD2
|
|
TEXCOORD3 TEXCOORD4
|
|
|
|
FOG PSIZE
|
|
|
|
VFACE VPOS
|
|
|
|
DEPTH0 DEPTH1 DEPTH2 DEPTH3 DEPTH4
|
|
)
|
|
end
|
|
|
|
ws = %r((?:\s|//.*?\n|/[*].*?[*]/)+)
|
|
id = /[a-zA-Z_][a-zA-Z0-9_]*/
|
|
|
|
state :root do
|
|
mixin :expr_whitespace
|
|
rule %r(
|
|
([\w*\s]+?[\s*]) # return arguments
|
|
(#{id}) # function name
|
|
(\s*\([^;]*?\)(?:\s*:\s+#{id})?) # signature
|
|
(#{ws}?)({|;) # open brace or semicolon
|
|
)mx do |m|
|
|
# This is copied from the C lexer
|
|
recurse m[1]
|
|
token Name::Function, m[2]
|
|
recurse m[3]
|
|
recurse m[4]
|
|
token Punctuation, m[5]
|
|
if m[5] == ?{
|
|
push :function
|
|
end
|
|
end
|
|
rule %r/\{/, Punctuation, :function
|
|
mixin :statements
|
|
end
|
|
end
|
|
end
|
|
end
|