@@ -2036,21 +2036,30 @@ bool GLSLSourceEmitter::_tryEmitBitBinOp(
2036
2036
return true ;
2037
2037
}
2038
2038
2039
- void GLSLSourceEmitter::emitBufferPointerTypeDefinition (IRInst* ptrType )
2039
+ void GLSLSourceEmitter::emitBufferPointerTypeDefinition (IRInst* type )
2040
2040
{
2041
+ auto ptrType = as<IRPtrType>(type);
2042
+ if (!ptrType)
2043
+ return ;
2044
+ if (ptrType->getAddressSpace () != AddressSpace::UserPointer)
2045
+ return ;
2041
2046
_requireGLSLExtension (UnownedStringSlice (" GL_EXT_buffer_reference" ));
2042
2047
2043
- auto constPtrType = as<IRHLSLConstBufferPointerType>(ptrType);
2044
2048
auto ptrTypeName = getName (ptrType);
2045
- auto alignment = getIntVal (constPtrType->getBaseAlignment ());
2049
+ IRSizeAndAlignment sizeAlignment;
2050
+ getNaturalSizeAndAlignment (
2051
+ m_codeGenContext->getTargetProgram ()->getOptionSet (),
2052
+ ptrType->getValueType (),
2053
+ &sizeAlignment);
2054
+ auto alignment = sizeAlignment.alignment ;
2046
2055
m_writer->emit (" layout(buffer_reference, std430, buffer_reference_align = " );
2047
2056
m_writer->emitInt64 (alignment);
2048
2057
m_writer->emit (" ) readonly buffer " );
2049
2058
m_writer->emit (ptrTypeName);
2050
2059
m_writer->emit (" \n " );
2051
2060
m_writer->emit (" {\n " );
2052
2061
m_writer->indent ();
2053
- emitType ((IRType*)constPtrType ->getValueType (), " _data" );
2062
+ emitType ((IRType*)ptrType ->getValueType (), " _data" );
2054
2063
m_writer->emit (" ;\n " );
2055
2064
m_writer->dedent ();
2056
2065
m_writer->emit (" };\n " );
@@ -2079,7 +2088,7 @@ void GLSLSourceEmitter::emitGlobalInstImpl(IRInst* inst)
2079
2088
{
2080
2089
switch (inst->getOp ())
2081
2090
{
2082
- case kIROp_HLSLConstBufferPointerType :
2091
+ case kIROp_PtrType :
2083
2092
emitBufferPointerTypeDefinition (inst);
2084
2093
break ;
2085
2094
// No need to use structs which are just taking part in a SSBO declaration
@@ -2102,6 +2111,43 @@ bool GLSLSourceEmitter::tryEmitInstExprImpl(IRInst* inst, const EmitOpInfo& inOu
2102
2111
m_writer->emit (" barrier();\n " );
2103
2112
return true ;
2104
2113
}
2114
+ case kIROp_Load :
2115
+ {
2116
+ auto addr = inst->getOperand (0 );
2117
+ auto ptrType = as<IRPtrType>(addr->getDataType ());
2118
+ if (!ptrType)
2119
+ return false ;
2120
+ if (ptrType->getAddressSpace () == AddressSpace::UserPointer)
2121
+ {
2122
+ auto prec = getInfo (EmitOp::Postfix);
2123
+ EmitOpInfo outerPrec = inOuterPrec;
2124
+ bool needClose = maybeEmitParens (outerPrec, prec);
2125
+ emitOperand (inst->getOperand (0 ), prec);
2126
+ m_writer->emit (" ._data" );
2127
+ maybeCloseParens (needClose);
2128
+ return true ;
2129
+ }
2130
+ return false ;
2131
+ }
2132
+ case kIROp_FieldAddress :
2133
+ {
2134
+ auto addr = inst->getOperand (0 );
2135
+ auto ptrType = as<IRPtrType>(addr->getDataType ());
2136
+ if (!ptrType)
2137
+ return false ;
2138
+ if (ptrType->getAddressSpace () == AddressSpace::UserPointer)
2139
+ {
2140
+ auto prec = getInfo (EmitOp::Postfix);
2141
+ EmitOpInfo outerPrec = inOuterPrec;
2142
+ bool needClose = maybeEmitParens (outerPrec, prec);
2143
+ emitOperand (inst->getOperand (0 ), prec);
2144
+ m_writer->emit (" ._data." );
2145
+ emitOperand (inst->getOperand (1 ), getInfo (EmitOp::General));
2146
+ maybeCloseParens (needClose);
2147
+ return true ;
2148
+ }
2149
+ return false ;
2150
+ }
2105
2151
case kIROp_MakeVectorFromScalar :
2106
2152
case kIROp_MatrixReshape :
2107
2153
{
@@ -2372,10 +2418,57 @@ bool GLSLSourceEmitter::tryEmitInstExprImpl(IRInst* inst, const EmitOpInfo& inOu
2372
2418
2373
2419
return true ;
2374
2420
}
2421
+ if (as<IRPtrType>(left->getDataType ()) || as<IRPtrType>(right->getDataType ()))
2422
+ {
2423
+ _requireGLSLExtension (
2424
+ UnownedStringSlice (" GL_EXT_shader_explicit_arithmetic_types_int64" ));
2375
2425
2426
+ // For pointers we need to cast to uint before comparing
2427
+ auto getOperatorString = [](IROp op) -> const char *
2428
+ {
2429
+ switch (op)
2430
+ {
2431
+ case kIROp_Eql :
2432
+ return " ==" ;
2433
+ case kIROp_Neq :
2434
+ return " !=" ;
2435
+ case kIROp_Greater :
2436
+ return " >" ;
2437
+ case kIROp_Less :
2438
+ return " <" ;
2439
+ case kIROp_Geq :
2440
+ return " >=" ;
2441
+ case kIROp_Leq :
2442
+ return " <=" ;
2443
+ default :
2444
+ return nullptr ;
2445
+ }
2446
+ };
2447
+ EmitOpInfo outerPrec = inOuterPrec;
2448
+ auto prec = getInfo (EmitOp::General);
2449
+ bool needClose = maybeEmitParens (outerPrec, prec);
2450
+
2451
+ m_writer->emit (" uint64_t(" );
2452
+ emitOperand (left, getInfo (EmitOp::General));
2453
+ m_writer->emit (" )" );
2454
+ m_writer->emit (" " );
2455
+ m_writer->emit (getOperatorString (inst->getOp ()));
2456
+ m_writer->emit (" " );
2457
+ m_writer->emit (" uint64_t(" );
2458
+ emitOperand (right, getInfo (EmitOp::General));
2459
+ m_writer->emit (" )" );
2460
+
2461
+ maybeCloseParens (needClose);
2462
+ return true ;
2463
+ }
2376
2464
// Use the default
2377
2465
break ;
2378
2466
}
2467
+ case kIROp_GetOffsetPtr :
2468
+ {
2469
+ _requireGLSLExtension (UnownedStringSlice (" GL_EXT_buffer_reference2" ));
2470
+ return false ;
2471
+ }
2379
2472
case kIROp_FRem :
2380
2473
{
2381
2474
IRInst* left = inst->getOperand (0 );
@@ -2560,6 +2653,16 @@ bool GLSLSourceEmitter::tryEmitInstExprImpl(IRInst* inst, const EmitOpInfo& inOu
2560
2653
m_writer->emit (" )" );
2561
2654
return true ;
2562
2655
}
2656
+ case kIROp_PtrLit :
2657
+ {
2658
+ auto ptrType = as<IRPtrType>(inst->getDataType ());
2659
+ if (ptrType)
2660
+ {
2661
+ m_writer->emit (" 0" );
2662
+ return true ;
2663
+ }
2664
+ break ;
2665
+ }
2563
2666
default :
2564
2667
break ;
2565
2668
}
@@ -3204,10 +3307,9 @@ void GLSLSourceEmitter::emitSimpleTypeImpl(IRType* type)
3204
3307
return ;
3205
3308
}
3206
3309
case kIROp_StructType :
3207
- case kIROp_HLSLConstBufferPointerType :
3310
+ case kIROp_PtrType :
3208
3311
m_writer->emit (getName (type));
3209
3312
return ;
3210
-
3211
3313
case kIROp_VectorType :
3212
3314
{
3213
3315
auto vecType = (IRVectorType*)type;
0 commit comments