 132cf53737
			
		
	
	
		132cf53737
		
	
	
	
	
		
			
			The grammar for no semicolon and no object name for cbuffer/tbuffer was correct, but the production still skipped the anonymous declarations if an identifier followed.
		
			
				
	
	
		
			48 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			GLSL
		
	
	
	
	
	
			
		
		
	
	
			48 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			GLSL
		
	
	
	
	
	
| cbuffer buf1 {
 | |
|     float4 v1;
 | |
| }; // extraneous ;
 | |
| 
 | |
| tbuffer buf2 {
 | |
|     float4 v2;
 | |
| }; // extraneous ;
 | |
| 
 | |
| cbuffer cbufName {
 | |
|     float4 v3 : packoffset(c0);
 | |
|     int i3    : packoffset(c1.y);
 | |
| }
 | |
| 
 | |
| tbuffer tbufName : register(t8) {
 | |
|     float4 v4 : packoffset(c1);
 | |
|     int i4    : packoffset(c3);
 | |
|     float f1  : packoffset(c3.w);
 | |
|     float f3  : packoffset(c4.x);
 | |
|     float f4  : packoffset(c4.y);
 | |
|     float f5  : packoffset(c4.z);
 | |
|     float f6  : packoffset(c);
 | |
|     float f7  : packoffset(c8);
 | |
|                  float3x4 m1 : packoffset(c7);
 | |
|        row_major float3x4 m2 : packoffset(c11);
 | |
|     column_major float3x4 m3 : packoffset(c15);
 | |
|                  float3x4 m4 : packoffset(c19);
 | |
| }
 | |
| 
 | |
| float foo() // float looks like identifier, but can't be part of tbuffer
 | |
| {
 | |
|     return 1.0;
 | |
| }
 | |
| 
 | |
| struct id {
 | |
|     float4 a;
 | |
| };
 | |
| 
 | |
| cbuffer cbufName2 {
 | |
|     float4 v24;
 | |
| }
 | |
| 
 | |
| id PixelShaderFunction(float4 input : SV_POSITION) : SV_TARGET0  // id looks like id for cbuffer name, but can't be
 | |
| {
 | |
|     id ret;
 | |
|     ret.a = v24 + (input + v1 + v2 + v3 + v4) * foo();
 | |
|     return ret;
 | |
| }
 |