diff --git a/spirv/emit_exp.pas b/spirv/emit_exp.pas index c964812b..d0a411b5 100644 --- a/spirv/emit_exp.pas +++ b/spirv/emit_exp.pas @@ -15,7 +15,7 @@ uses srReg, srOutput, srOp, - srOpUtils, + srOpInternal, emit_fetch; type @@ -226,7 +226,7 @@ begin Inc(push_count); exc:=MakeRead(get_exec0,dtBool); //It means that lane_id=0 - node:=AddSpirvOp(OpMakeExp); + node:=AddSpirvOp(srOpInternal.OpMakeExp); node.AddParam(exc); //<-fetch read end; diff --git a/spirv/emit_fetch.pas b/spirv/emit_fetch.pas index 89e8e0c0..905a1d5e 100644 --- a/spirv/emit_fetch.pas +++ b/spirv/emit_fetch.pas @@ -15,6 +15,7 @@ uses srConst, srReg, srOp, + srOpInternal, srOpUtils, srLayout, srVertLayout, @@ -157,8 +158,8 @@ begin if (pop_1[0]=nil) then Exit; if (pop_1[1]=nil) then Exit; - if (pop_1[0].OpId<>srOpUtils.OpIAddExt) then Exit; - if (pop_1[1].OpId<>srOpUtils.OpIAddExt) then Exit; + if (pop_1[0].OpId<>srOpInternal.OpIAddExt) then Exit; + if (pop_1[1].OpId<>srOpInternal.OpIAddExt) then Exit; //S_ADD_U32 imms_p0[0]:=GetRegConst(pop_1[0].ParamNode(0).AsReg); //const diff --git a/spirv/emit_op.pas b/spirv/emit_op.pas index 1fd1d5de..c4bb389a 100644 --- a/spirv/emit_op.pas +++ b/spirv/emit_op.pas @@ -13,6 +13,7 @@ uses srReg, srOp, srCFGLabel, + srOpInternal, srOpUtils, srCacheOp, srInterface; @@ -681,7 +682,7 @@ Var begin Assert(rtype.Sign=0); - node:=AddSpirvOp(srOpUtils.OpIAddExt); //need first + node:=AddSpirvOp(srOpInternal.OpIAddExt); //need first node.AddParam(src0); node.AddParam(src1); @@ -700,7 +701,7 @@ Var begin Assert(dst.dtype.Sign=0); - node:=AddSpirvOp(srOpUtils.OpIAddExt); //need first + node:=AddSpirvOp(srOpInternal.OpIAddExt); //need first node.AddParam(src0); node.AddParam(src1); @@ -745,7 +746,7 @@ Var begin Assert(rtype.Sign=0); - node:=AddSpirvOp(srOpUtils.OpISubExt); //need first + node:=AddSpirvOp(srOpInternal.OpISubExt); //need first node.AddParam(src0); node.AddParam(src1); @@ -761,22 +762,22 @@ end; function TEmitOp.OpAbsDiff(pLine:TspirvOp;dst,src0,src1:TsrRegNode):TspirvOp; begin - Result:=_Op2(pLine,srOpUtils.OpAbsDiff,dst,src0,src1); + Result:=_Op2(pLine,srOpInternal.OpAbsDiff,dst,src0,src1); end; procedure TEmitOp.OpWQM32(dst:PsrRegSlot;src:TsrRegNode); begin - Op1(srOpUtils.OpWQM32,dtUnknow,dst,src); + Op1(srOpInternal.OpWQM32,dtUnknow,dst,src); end; procedure TEmitOp.OpBFE_32(dst:PsrRegSlot;base,src0,src1:TsrRegNode); begin - Op3(srOpUtils.OpBFE_32,base.dtype,dst,base,src0,src1); + Op3(srOpInternal.OpBFE_32,base.dtype,dst,base,src0,src1); end; procedure TEmitOp.OpBFIB32(dst:PsrRegSlot;bitmsk,src0,src1:TsrRegNode); begin - Op3(srOpUtils.OpBFIB32,dtUint32,dst,bitmsk,src0,src1); + Op3(srOpInternal.OpBFIB32,dtUint32,dst,bitmsk,src0,src1); end; function TEmitOp.OpBFITo(src0,src1,src2,src3:TsrRegNode;ppLine:PPspirvOp=nil):TsrRegNode; @@ -795,7 +796,7 @@ end; procedure TEmitOp.OpPackAnc(dst:PsrRegSlot;prim,smid,rtid:TsrRegNode); begin - Op3(srOpUtils.OpPackAnc,dtUint32,dst,prim,smid,rtid); + Op3(srOpInternal.OpPackAnc,dtUint32,dst,prim,smid,rtid); end; // @@ -898,11 +899,11 @@ begin pLine:=GetMaxPlace(pLine,1,@src); - p:=CacheOpList.Fetch(pLine.Parent,srOpUtils.OpPackOfs,rtype,1,@src); + p:=CacheOpList.Fetch(pLine.Parent,srOpInternal.OpPackOfs,rtype,1,@src); if (p.pDst=nil) then begin - node:=AddSpirvOp(pLine,srOpUtils.OpPackOfs); //need first + node:=AddSpirvOp(pLine,srOpInternal.OpPackOfs); //need first dst:=NewReg(rtype); @@ -960,11 +961,11 @@ begin pLine:=GetMaxPlace(pLine,rtype.Count,src); - p:=CacheOpList.Fetch(pLine.Parent,srOpUtils.OpMakeVec,rtype,rtype.Count,src); + p:=CacheOpList.Fetch(pLine.Parent,srOpInternal.OpMakeVec,rtype,rtype.Count,src); if (p.pDst=nil) then begin - node:=AddSpirvOp(pLine,srOpUtils.OpMakeVec); //need first + node:=AddSpirvOp(pLine,srOpInternal.OpMakeVec); //need first dst:=NewReg(rtype); @@ -995,11 +996,11 @@ begin pLine:=GetMaxPlace(pLine,rtype.Count,src); - p:=CacheOpList.Fetch(pLine.Parent,srOpUtils.OpMakeCub,rtype,rtype.Count,src); + p:=CacheOpList.Fetch(pLine.Parent,srOpInternal.OpMakeCub,rtype,rtype.Count,src); if (p.pDst=nil) then begin - node:=AddSpirvOp(pLine,srOpUtils.OpMakeCub); //need first + node:=AddSpirvOp(pLine,srOpInternal.OpMakeCub); //need first dst:=NewReg(rtype); diff --git a/spirv/emit_post.pas b/spirv/emit_post.pas index 9afc4279..a9497944 100644 --- a/spirv/emit_post.pas +++ b/spirv/emit_post.pas @@ -662,7 +662,7 @@ begin if (node.read_count<>0) then if not node.is_force then begin - Assert(false,'Wrong read_count on:'+Op.GetStr(node.OpId)); + Assert(false,'Wrong read_count on:'+OpGetStrDebug(node)); end; // node.Remove; @@ -1147,8 +1147,6 @@ function TSprvEmit_post.LinkBitcast(pBuffer:TsrBuffer):TsrNode; var pLine:TspirvOp; - use:Boolean; - tbuf:TsrBuffer; tref:TsrNode; pType:TsrType; diff --git a/spirv/emit_post_op.pas b/spirv/emit_post_op.pas index 5730764f..d5866ba3 100644 --- a/spirv/emit_post_op.pas +++ b/spirv/emit_post_op.pas @@ -18,6 +18,7 @@ uses srReg, srPrivate, srOp, + srOpInternal, srOpUtils, emit_fetch; @@ -95,12 +96,12 @@ begin Op.OpShiftRightLogical, Op.OpShiftRightArithmetic:Result:=OnShr1(node); - srOpUtils.OpAbsDiff :Result:=OnAbsDiff1(node); - srOpUtils.OpWQM32 :Result:=OnWQM32__1(node); - srOpUtils.OpPackOfs :Result:=OnPackOfs1(node); - srOpUtils.OpBFE_32 :Result:=OnBFE_32_1(node); - srOpUtils.OpBFIB32 :Result:=OnBFIB32_1(node); - srOpUtils.OpMakeCub :Result:=OnMakeCub1(node); + srOpInternal.OpAbsDiff :Result:=OnAbsDiff1(node); + srOpInternal.OpWQM32 :Result:=OnWQM32__1(node); + srOpInternal.OpPackOfs :Result:=OnPackOfs1(node); + srOpInternal.OpBFE_32 :Result:=OnBFE_32_1(node); + srOpInternal.OpBFIB32 :Result:=OnBFIB32_1(node); + srOpInternal.OpMakeCub :Result:=OnMakeCub1(node); Op.OpSelect :Result:=OnSelect1(node); @@ -127,11 +128,10 @@ begin Case node.OpId of - srOpUtils.OpIAddExt:Result:=OnIAddExt2(node); - srOpUtils.OpISubExt:Result:=OnISubExt2(node); - srOpUtils.OpMakeVec:Result:=OnMakeVec2(node); - - srOpUtils.OpPackAnc:Result:=OnPackAnc2(node); + srOpInternal.OpIAddExt:Result:=OnIAddExt2(node); + srOpInternal.OpISubExt:Result:=OnISubExt2(node); + srOpInternal.OpMakeVec:Result:=OnMakeVec2(node); + srOpInternal.OpPackAnc:Result:=OnPackAnc2(node); Op.OpReturn:Result:=OnReturn_2(node); OpMakeExp :Result:=OnMakeExp2(node); @@ -140,6 +140,8 @@ begin OpCUBESC:OnCUBESC2(node); OpCUBETC:OnCUBETC2(node); OpCUBEMA:OnCUBEMA2(node); + + srOpInternal.OpMakeCub:Assert(false,'OpMakeCub'); end; end; @@ -2039,7 +2041,7 @@ begin pLine:=node.pWriter.specialize AsType; if (pLine=nil) then Exit; - if (pLine.OpId<>srOpUtils.OpPackAnc) then Exit; + if (pLine.OpId<>srOpInternal.OpPackAnc) then Exit; src[0]:=pLine.ParamNode(0).AsReg; src[1]:=pLine.ParamNode(1).AsReg; @@ -2294,6 +2296,33 @@ begin Result:=True; end; +function _GetMadLegacyFma(node:TSpirvOp):TSpirvOp; +var + reg:TsrRegNode; + fma:TSpirvOp; +begin + Result:=node; + if (node=nil) then Exit; + if (node.OpId<>Op.OpSelect) then Exit; + + reg:=RegDown(node.ParamNode(1).AsReg); + fma:=reg.pWriter.specialize AsType; + + if _IsFma(fma) then + begin + Exit(fma); + end; + + reg:=RegDown(node.ParamNode(2).AsReg); + fma:=reg.pWriter.specialize AsType; + + if _IsFma(fma) then + begin + Exit(fma); + end; + +end; + function _IsOp(node:TSpirvOp;OpId:DWORD):Boolean; begin Result:=False; @@ -2480,6 +2509,9 @@ begin m_y:=RegDown(node.ParamNode(1).AsReg).pWriter.specialize AsType; //param2 m_f:=RegDown(node.ParamNode(2).AsReg).pWriter.specialize AsType; //param3 + m_x:=_GetMadLegacyFma(m_x); + m_y:=_GetMadLegacyFma(m_y); + if not _IsFma(m_x) then Exit; if not _IsFma(m_y) then Exit; if not _IsOp(m_f,OpCUBEID) then Exit; diff --git a/spirv/emit_print.pas b/spirv/emit_print.pas index 5bed5734..fbc5107c 100644 --- a/spirv/emit_print.pas +++ b/spirv/emit_print.pas @@ -13,6 +13,7 @@ uses srConst, srVariable, srOp, + srOpInternal, srOpUtils, strutils, srCapability, @@ -198,10 +199,10 @@ begin if Info.result then //dst begin Assert(node.pDst<>nil,'PrintOp$1'); - Write(PadRight(GetNodeStr(node.pDst),PadAssign),' = ',Op.GetStr(node.OpId)); + Write(PadRight(GetNodeStr(node.pDst),PadAssign),' = ',OpGetStrInternal(node.OpId)); end else begin //no dst - Write(Op.GetStr(node.OpId)); + Write(OpGetStrInternal(node.OpId)); if (node.pDst<>nil) then begin Write(' ',GetNodeStr(node.pDst)); diff --git a/spirv/emit_vbuf_chain.pas b/spirv/emit_vbuf_chain.pas index 20e31040..82d865fb 100644 --- a/spirv/emit_vbuf_chain.pas +++ b/spirv/emit_vbuf_chain.pas @@ -14,7 +14,6 @@ uses srLayout, srConfig, emit_fetch, - srop, srVBufInfo; type diff --git a/spirv/emit_vop3.pas b/spirv/emit_vop3.pas index 06062b94..ac7c4985 100644 --- a/spirv/emit_vop3.pas +++ b/spirv/emit_vop3.pas @@ -10,7 +10,7 @@ uses spirv, srType, srReg, - srOpUtils, + srOpInternal, emit_fetch; type @@ -1466,10 +1466,10 @@ begin V_MED3_U32: emit_V_MED3_U32; V_FMA_F32 : emit_V_FMA_F32; - V_CUBEID_F32:emit_V_CUBE(OpCUBEID); - V_CUBESC_F32:emit_V_CUBE(OpCUBESC); - V_CUBETC_F32:emit_V_CUBE(OpCUBETC); - V_CUBEMA_F32:emit_V_CUBE(OpCUBEMA); + V_CUBEID_F32:emit_V_CUBE(srOpInternal.OpCUBEID); + V_CUBESC_F32:emit_V_CUBE(srOpInternal.OpCUBESC); + V_CUBETC_F32:emit_V_CUBE(srOpInternal.OpCUBETC); + V_CUBEMA_F32:emit_V_CUBE(srOpInternal.OpCUBEMA); //VOP1 analog diff --git a/spirv/pssl-spirv.lpi b/spirv/pssl-spirv.lpi index 3962d86e..7280bb6b 100644 --- a/spirv/pssl-spirv.lpi +++ b/spirv/pssl-spirv.lpi @@ -25,7 +25,7 @@ - + @@ -294,6 +294,10 @@ + + + + diff --git a/spirv/srBuffer.pas b/spirv/srBuffer.pas index f24202f4..1cc8ece1 100644 --- a/spirv/srBuffer.pas +++ b/spirv/srBuffer.pas @@ -11,7 +11,6 @@ uses srNode, srType, srTypes, - srVariable, srLayout, srDecorate, srConfig; @@ -836,6 +835,7 @@ function TsrBuffer.chain_read:DWORD; var node:TsrBuffer; begin + Result:=0; if Flags.Bitcast then begin node:=Self; @@ -870,6 +870,7 @@ function TsrBuffer.chain_write:DWORD; var node:TsrBuffer; begin + Result:=0; if Flags.Bitcast then begin node:=Self; diff --git a/spirv/srCFGParser.pas b/spirv/srCFGParser.pas index 02780068..d2091817 100644 --- a/spirv/srCFGParser.pas +++ b/spirv/srCFGParser.pas @@ -694,8 +694,6 @@ begin end; procedure TsrCFGParser.Print(); -const - print_block_id=False; var prefix:RawByteString; node,next:TsrCFGBlock; diff --git a/spirv/srLayout.pas b/spirv/srLayout.pas index 8ab0b414..bc998d18 100644 --- a/spirv/srLayout.pas +++ b/spirv/srLayout.pas @@ -1100,11 +1100,6 @@ begin end; Procedure TsrChain.SetRegType(rtype:TsrDataType); -var - pTypeList:PsrTypeList; - FType:TsrType; - node:TDependenceNode; - pLine:TSpirvOp; begin if (Fdtype=rtype) then Exit; @@ -1112,51 +1107,7 @@ begin Fdtype:=rtype; - pTypeList:=Emit.GetTypeList; - FType:=pTypeList^.Fetch(rtype); - UpdateRegType; - - { - node:=FList.pHead; - While (node<>nil) do - begin - pLine:=node.pNode; - - Case pLine.OpId of - - Op.OpLoad: - begin - pLine.pDst.PrepType(ord(rtype)); - pLine.pType:=Ftype; - end; - - Op.OpStore, - Op.OpAtomicStore, - Op.OpAtomicExchange, - Op.OpAtomicCompareExchange, - Op.OpAtomicCompareExchangeWeak, - Op.OpAtomicIIncrement, - Op.OpAtomicIDecrement, - Op.OpAtomicIAdd, - Op.OpAtomicISub, - Op.OpAtomicSMin, - Op.OpAtomicUMin, - Op.OpAtomicSMax, - Op.OpAtomicUMax, - Op.OpAtomicAnd, - Op.OpAtomicOr, - Op.OpAtomicXor: - begin - pLine.ParamNode(1).Value.PrepType(ord(rtype)); - end; - - else; - end; - - node:=node.pNext; - end; - } end; Procedure TsrChain.SetIndex(t:TsrRegNode); diff --git a/spirv/srOp.pas b/spirv/srOp.pas index 4d3a8d43..28dda29e 100644 --- a/spirv/srOp.pas +++ b/spirv/srOp.pas @@ -7,6 +7,7 @@ interface uses sysutils, spirv, + srOpInternal, ginodes, srNode, srCFGLabel, @@ -227,6 +228,7 @@ type end; Function classif_rw_op(OpId:DWORD):Byte; +function OpGetStrDebug(pLine:TSpirvOp):RawByteString; operator := (i:TsrNode):TspirvOp; inline; operator := (i:TsrNode):TsrOpBlock; inline; @@ -268,6 +270,28 @@ end; // +function OpGetStrDebug(pLine:TSpirvOp):RawByteString; +var + V:PtrUint; +begin + Result:=''; + if (pLine=nil) then Exit; + + if (pLine.OpId=Op.OpExtInst) then + begin + V:=0; + if pLine.ParamNode(1).TryGetValue(V) then + begin + Result:=GlslOp.GetStr(V); + end; + end else + begin + Result:=OpGetStrInternal(pLine.OpId); + end; +end; + +// + Procedure TspirvOp._zero_read; begin UnClear; @@ -548,7 +572,7 @@ begin if not is_force then begin can_clear; - Assert(false,'Wrong read_count on:'+Op.GetStr(OpId)); + Assert(false,'Wrong read_count on:'+OpGetStrDebug(Self)); end; FType.mark_unread(Self); diff --git a/spirv/srOpInternal.pas b/spirv/srOpInternal.pas new file mode 100644 index 00000000..7168b638 --- /dev/null +++ b/spirv/srOpInternal.pas @@ -0,0 +1,63 @@ +unit srOpInternal; + +{$mode ObjFPC}{$H+} + +interface + +uses + spirv; + +const + OpIAddExt=DWORD(-1); + OpISubExt=DWORD(-2); + OpAbsDiff=DWORD(-3); + OpWQM32 =DWORD(-4); + + OpBFE_32 =DWORD(-5); + OpBFIB32 =DWORD(-6); + + OpPackAnc=DWORD(-7); + OpPackOfs=DWORD(-8); + OpMakeExp=DWORD(-9); + OpMakeVec=DWORD(-10); + OpMakeCub=DWORD(-11); + + OpCUBEID =DWORD(-12); + OpCUBESC =DWORD(-13); + OpCUBETC =DWORD(-14); + OpCUBEMA =DWORD(-15); + +function OpGetStrInternal(OpId:DWORD):RawByteString; + +implementation + +function OpGetStrInternal(OpId:DWORD):RawByteString; +begin + case OpId of + + OpIAddExt:Result:='[OpIAddExt]'; + OpISubExt:Result:='[OpISubExt]'; + OpAbsDiff:Result:='[OpAbsDiff]'; + OpWQM32 :Result:='[OpWQM32]'; + + OpBFE_32 :Result:='[OpBFE_32]'; + OpBFIB32 :Result:='[OpBFIB32]'; + + OpPackAnc:Result:='[OpPackAnc]'; + OpPackOfs:Result:='[OpPackOfs]'; + OpMakeExp:Result:='[OpMakeExp]'; + OpMakeVec:Result:='[OpMakeVec]'; + OpMakeCub:Result:='[OpMakeCub]'; + + OpCUBEID :Result:='[OpCUBEID]'; + OpCUBESC :Result:='[OpCUBESC]'; + OpCUBETC :Result:='[OpCUBETC]'; + OpCUBEMA :Result:='[OpCUBEMA]'; + + else + Result:=Op.GetStr(OpId); + end; +end; + +end. + diff --git a/spirv/srOpUtils.pas b/spirv/srOpUtils.pas index c958330c..d8374a7c 100644 --- a/spirv/srOpUtils.pas +++ b/spirv/srOpUtils.pas @@ -13,26 +13,6 @@ uses srVariable, srCFGLabel; -const - OpIAddExt=DWORD(-1); - OpISubExt=DWORD(-2); - OpAbsDiff=DWORD(-3); - OpWQM32 =DWORD(-4); - - OpBFE_32 =DWORD(-5); - OpBFIB32 =DWORD(-6); - - OpPackAnc=DWORD(-7); - OpPackOfs=DWORD(-8); - OpMakeExp=DWORD(-9); - OpMakeVec=DWORD(-10); - OpMakeCub=DWORD(-11); - - OpCUBEID =DWORD(-12); - OpCUBESC =DWORD(-13); - OpCUBETC =DWORD(-14); - OpCUBEMA =DWORD(-15); - function InsSpirvOp(pLine,pNew:TSpirvOp):TSpirvOp; Function get_inverse_left_cmp_op(OpId:DWORD):DWORD; Function get_inverse_not_cmp_op(OpId:DWORD):DWORD; @@ -61,56 +41,11 @@ function flow_down_next_up(pLine:TSpirvOp):TSpirvOp; function flow_down_prev_up(pLine:TSpirvOp):TSpirvOp; function flow_prev_up(pLine:TSpirvOp):TSpirvOp; -function OpGetStr(pLine:TSpirvOp):RawByteString; - implementation uses srPrivate; -function OpGetStr(pLine:TSpirvOp):RawByteString; -var - V:PtrUint; -begin - Result:=''; - if (pLine=nil) then Exit; - - case pLine.OpId of - OpIAddExt:Result:='OpIAddExt'; - OpISubExt:Result:='OpISubExt'; - OpAbsDiff:Result:='OpAbsDiff'; - OpWQM32 :Result:='OpWQM32'; - - OpBFE_32 :Result:='OpBFE_32'; - OpBFIB32 :Result:='OpBFIB32'; - - OpPackAnc:Result:='OpPackAnc'; - OpPackOfs:Result:='OpPackOfs'; - OpMakeExp:Result:='OpMakeExp'; - OpMakeVec:Result:='OpMakeVec'; - OpMakeCub:Result:='OpMakeCub'; - - OpCUBEID :Result:='OpCUBEID'; - OpCUBESC :Result:='OpCUBESC'; - OpCUBETC :Result:='OpCUBETC'; - OpCUBEMA :Result:='OpCUBEMA'; - - Op.OpExtInst: - begin - V:=0; - if pLine.ParamNode(1).TryGetValue(V) then - begin - Result:=GlslOp.GetStr(V); - end; - end; - - else - begin - Result:=Op.GetStr(pLine.OpId); - end; - end; -end; - //-- function flow_down_next_up(pLine:TSpirvOp):TSpirvOp; diff --git a/spirv/srOutput.pas b/spirv/srOutput.pas index 2cae608d..02ec7aae 100644 --- a/spirv/srOutput.pas +++ b/spirv/srOutput.pas @@ -7,7 +7,6 @@ interface uses typinfo, spirv, - ginodes, srNode, srType, srOp, diff --git a/spirv/srPrivate.pas b/spirv/srPrivate.pas index b6d68a8b..53fd093a 100644 --- a/spirv/srPrivate.pas +++ b/spirv/srPrivate.pas @@ -298,8 +298,6 @@ end; Procedure TsrPrivate.SetRegType(rtype:TsrDataType); var pTypeList:PsrTypeList; - node:TDependenceNode; - pLine:TspirvOp; begin pTypeList:=Emit.GetTypeList; Ftype:=pTypeList^.Fetch(rtype); diff --git a/spirv/srVBufInfo.pas b/spirv/srVBufInfo.pas index ec18d1cd..d36dc432 100644 --- a/spirv/srVBufInfo.pas +++ b/spirv/srVBufInfo.pas @@ -25,10 +25,10 @@ type SLC :Byte; //Volatile function GetResultType:TsrDataType; function GetElemType:TsrDataType; - function GetElemCount:Byte; inline; - function GetElemSize:Byte; inline; - function GetSizeFormat:Byte; inline; - function GetAlignSize:Byte; inline; + function GetElemCount:Byte; + function GetElemSize:Byte; + function GetSizeFormat:Byte; + function GetAlignSize:Byte; function IsComp:Boolean; function IsExtFormat:Boolean; function GetImageFormat:Byte; @@ -191,17 +191,17 @@ begin Result:=DFMT_ELEM_COUNT[DFMT]; end; -function TBuf_info.GetElemCount:Byte; inline; +function TBuf_info.GetElemCount:Byte; begin Result:=DFMT_ELEM_COUNT[DFMT]; end; -function TBuf_info.GetElemSize:Byte; inline; +function TBuf_info.GetElemSize:Byte; begin Result:=DFMT_ELEM_SIZE[DFMT]; end; -function TBuf_info.GetSizeFormat:Byte; inline; +function TBuf_info.GetSizeFormat:Byte; begin Result:=DFMT_SIZE[DFMT]; end; @@ -211,7 +211,7 @@ begin if (a