diff --git a/chip/pm4_me.pas b/chip/pm4_me.pas index c386ce75..63115967 100644 --- a/chip/pm4_me.pas +++ b/chip/pm4_me.pas @@ -2029,6 +2029,10 @@ begin ctx.Render.AddClearColor(ctx.rt_info^.DB_INFO.CLEAR_VALUE); + Writeln('BindDepth:->'#13#10, + ' 0x',HexStr(ri.FHandle,16),':',ri.key.cformat,':',ri.FName,'->'#13#10, + ' 0x',HexStr(iv.FHandle,16),':',iv.key.cformat,':',iv.FName); + // if limits.VK_KHR_imageless_framebuffer then begin diff --git a/chip/shader_dump.pas b/chip/shader_dump.pas index 6adc3ecc..9697fb42 100644 --- a/chip/shader_dump.pas +++ b/chip/shader_dump.pas @@ -7,6 +7,7 @@ interface uses Classes, SysUtils, + md_systm, kern_authinfo, kern_proc, murmurhash, @@ -107,13 +108,19 @@ begin end; Procedure DUMP_USER_DATA(F:THandle;base:Pointer;REG:WORD;USER_DATA:PDWORD); +const + InputUsageSize=1024; //size is unknow var i:Integer; buf:Pointer; + InputUsagePtr:Pointer; size:DWORD; USEAGE_DATA:TUSER_DATA_USEAGE; begin USEAGE_DATA:=_calc_usage(_calc_shader_info(base),USER_DATA); + // + InputUsagePtr:=nil; + // For i:=0 to 15 do begin Case USEAGE_DATA[i] of @@ -132,13 +139,23 @@ begin buf:=getBufferAddress(USER_DATA[i],USER_DATA[i+1]); if (buf<>nil) then begin - size:=256; //size is unknow - DUMP_BLOCK(F,REG+i,buf,size); + if (InputUsagePtr=nil) then + begin + InputUsagePtr:=GetMem(InputUsageSize); + end; + FillChar(InputUsagePtr^,InputUsageSize,0); + md_copyin(buf,InputUsagePtr,InputUsageSize,nil); + DUMP_BLOCK(F,REG+i,InputUsagePtr,InputUsageSize); end; end; end; end; + // + if (InputUsagePtr<>nil) then + begin + FreeMem(InputUsagePtr); + end; end; function Trim(const S: RawByteString): RawByteString; diff --git a/vulkan/vImageManager.pas b/vulkan/vImageManager.pas index 791b5d34..4741d31d 100644 --- a/vulkan/vImageManager.pas +++ b/vulkan/vImageManager.pas @@ -527,7 +527,7 @@ end; function TvImage2.FetchViewRaw(cmd:TvCustomCmdBuffer;const F:TvImageViewKey;usage:TVkFlags):TvImageView2; var - key2:TvImageViewKey; + key_view:TvImageViewKey; i:TvImageView2Set.Iterator; t:TvImageView2; @@ -543,18 +543,31 @@ begin if (Self=nil) then Exit; if (FHandle=VK_NULL_HANDLE) then Exit; - if (usage=0) then - begin - usage:=GET_VK_IMAGE_USAGE_DEFAULT(F.cformat); + key_view:=F; + + case FFormat of + VK_FORMAT_R32_UINT, + VK_FORMAT_R32_SINT, + VK_FORMAT_R32_SFLOAT: + if (key_view.cformat=VK_FORMAT_D32_SFLOAT) then + begin + //downlift to image + key_view.cformat:=FFormat; + end; + else; end; - key2:=F; - key2.fusage:=usage; + if (usage=0) then + begin + usage:=GET_VK_IMAGE_USAGE_DEFAULT(key_view.cformat); + end; + + key_view.fusage:=usage; rw_wlock(lock); t:=nil; - i:=FViews.find(@key2); + i:=FViews.find(@key_view); if (i.Item<>nil) then begin t:=TvImageView2(ptruint(i.Item^)-ptruint(@TvImageView2(nil).key)); @@ -563,18 +576,18 @@ begin cinfo:=Default(TVkImageViewCreateInfo); cinfo.sType :=VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; cinfo.image :=FHandle; - cinfo.viewType :=TVkImageViewType(F.vtype); - cinfo.format :=F.cformat; - cinfo.components.r:=TVkComponentSwizzle(F.dstSel.x); - cinfo.components.g:=TVkComponentSwizzle(F.dstSel.y); - cinfo.components.b:=TVkComponentSwizzle(F.dstSel.z); - cinfo.components.a:=TVkComponentSwizzle(F.dstSel.w); + cinfo.viewType :=TVkImageViewType(key_view.vtype); + cinfo.format :=key_view.cformat; + cinfo.components.r:=TVkComponentSwizzle(key_view.dstSel.x); + cinfo.components.g:=TVkComponentSwizzle(key_view.dstSel.y); + cinfo.components.b:=TVkComponentSwizzle(key_view.dstSel.z); + cinfo.components.a:=TVkComponentSwizzle(key_view.dstSel.w); - cinfo.subresourceRange.aspectMask :=GetAspectMaskByFormat(F.cformat); - cinfo.subresourceRange.baseMipLevel :=F.base_level; - cinfo.subresourceRange.levelCount :=F.last_level-F.base_level+1; - cinfo.subresourceRange.baseArrayLayer:=F.baseArrayLayer; - cinfo.subresourceRange.layerCount :=F.layerCount; + cinfo.subresourceRange.aspectMask :=GetAspectMaskByFormat(key_view.cformat); + cinfo.subresourceRange.baseMipLevel :=key_view.base_level; + cinfo.subresourceRange.levelCount :=key_view.last_level-key_view.base_level+1; + cinfo.subresourceRange.baseArrayLayer:=key_view.baseArrayLayer; + cinfo.subresourceRange.layerCount :=key_view.layerCount; if (cinfo.subresourceRange.baseArrayLayer + cinfo.subresourceRange.layerCount) > self.key.params.layerCount @@ -629,13 +642,13 @@ begin uinfo.usage:=usage; if limits.VK_EXT_image_view_min_lod and - (F.minLod<>0) then + (key_view.minLod<>0) then begin uinfo.pNext:=@minfo; // minfo:=Default(TVkImageViewMinLodCreateInfoEXT); minfo.sType :=VK_STRUCTURE_TYPE_IMAGE_VIEW_MIN_LOD_CREATE_INFO_EXT; - minfo.minLod:=F.minLod; + minfo.minLod:=key_view.minLod; end; Writeln('vkCreateImageView:',cinfo.format); @@ -652,7 +665,7 @@ begin t:=TvImageView2.Create; t.FHandle:=FView; t.Parent :=Self; - t.key :=key2; + t.key :=key_view; t.SetObjectName('V_'+_get_dst_sel_str(t.key.dstSel)+ '_L['+IntToStr(t.key.base_level)+'-'+IntToStr(t.key.last_level)+']'+ diff --git a/vulkan/vImageTiling.pas b/vulkan/vImageTiling.pas index 5a3bae82..49402e38 100644 --- a/vulkan/vImageTiling.pas +++ b/vulkan/vImageTiling.pas @@ -765,7 +765,7 @@ begin Exit(False); end; - m_offset:=buf.FAddr-QWORD(image.key.addr); + m_offset:=QWORD(image.key.addr)-buf.FAddr; image.PushBarrier(cmd, ord(VK_ACCESS_TRANSFER_WRITE_BIT), @@ -893,7 +893,7 @@ begin Exit(False); end; - m_offset:=buf.FAddr-QWORD(image.key.addr); + m_offset:=QWORD(image.key.addr)-buf.FAddr; image.PushBarrier(cmd, ord(VK_ACCESS_TRANSFER_READ_BIT), diff --git a/vulkan/vRegs2Vulkan.pas b/vulkan/vRegs2Vulkan.pas index b6ad6f10..d59d4088 100644 --- a/vulkan/vRegs2Vulkan.pas +++ b/vulkan/vRegs2Vulkan.pas @@ -158,13 +158,13 @@ function GET_INDEX_TYPE_SIZE(INDEX_TYPE:TVkIndexType):Byte; // function _get_vsharp_cformat(PV:PVSharpResource4):TVkFormat; -function _get_tsharp4_cformat(PT:PTSharpResource4):TVkFormat; +function _get_tsharp4_cformat(PT:PTSharpResource4;hint:s_image_usage):TVkFormat; -function _get_tsharp4_image_info(PT:PTSharpResource4):TvImageKey; -function _get_tsharp8_image_info(PT:PTSharpResource8):TvImageKey; +function _get_tsharp4_image_info(PT:PTSharpResource4;hint:s_image_usage):TvImageKey; +function _get_tsharp8_image_info(PT:PTSharpResource8;hint:s_image_usage):TvImageKey; -function _get_tsharp4_image_view(PT:PTSharpResource4):TvImageViewKey; -function _get_tsharp8_image_view(PT:PTSharpResource8):TvImageViewKey; +function _get_tsharp4_image_view(PT:PTSharpResource4;hint:s_image_usage):TvImageViewKey; +function _get_tsharp8_image_view(PT:PTSharpResource8;hint:s_image_usage):TvImageViewKey; function _get_ssharp_info(PS:PSSharpResource4):TVkSamplerCreateInfo; @@ -2028,7 +2028,7 @@ begin end; end; -function _get_tsharp4_cformat(PT:PTSharpResource4):TVkFormat; +function _get_tsharp4_cformat(PT:PTSharpResource4;hint:s_image_usage):TVkFormat; begin Result:=VK_FORMAT_UNDEFINED; if (PT=nil) then Exit; @@ -2147,7 +2147,8 @@ begin IMG_DATA_FORMAT_16_16_16_16 :Result:=VK_FORMAT_R16G16B16A16_UINT; IMG_DATA_FORMAT_32 : - if IsTileModeDepth(PT^.tiling_idx) then + if (not (iu_storage in hint)) and + IsTileModeDepth(PT^.tiling_idx) then begin Result:=VK_FORMAT_D32_SFLOAT; end else @@ -2192,7 +2193,8 @@ begin IMG_DATA_FORMAT_16_16_16_16:Result:=VK_FORMAT_R16G16B16A16_SINT; IMG_DATA_FORMAT_32 : - if IsTileModeDepth(PT^.tiling_idx) then + if (not (iu_storage in hint)) and + IsTileModeDepth(PT^.tiling_idx) then begin Result:=VK_FORMAT_D32_SFLOAT; end else @@ -2234,7 +2236,8 @@ begin IMG_DATA_FORMAT_16_16_16_16:Result:=VK_FORMAT_R16G16B16A16_SFLOAT; IMG_DATA_FORMAT_32 : - if IsTileModeDepth(PT^.tiling_idx) then + if (not (iu_storage in hint)) and + IsTileModeDepth(PT^.tiling_idx) then begin Result:=VK_FORMAT_D32_SFLOAT; end else @@ -2258,13 +2261,13 @@ begin Assert(Result<>VK_FORMAT_UNDEFINED,'[_get_tsharp4_cformat] dfmt:'+_get_tex_dfmt_str(PT^.dfmt)+' nfmt:'+_get_tex_nfmt_str(PT^.nfmt)); end; -function _get_tsharp4_image_info(PT:PTSharpResource4):TvImageKey; +function _get_tsharp4_image_info(PT:PTSharpResource4;hint:s_image_usage):TvImageKey; begin Result:=Default(TvImageKey); if (PT=nil) then Exit; Result.Addr:=Pointer(PT^.base shl 8); - Result.cformat:=_get_tsharp4_cformat(PT); + Result.cformat:=_get_tsharp4_cformat(PT,hint); if (Result.cformat=VK_FORMAT_UNDEFINED) then begin @@ -2317,9 +2320,9 @@ begin Result.params.pad_height:=Result.params.height; end; -function _get_tsharp8_image_info(PT:PTSharpResource8):TvImageKey; +function _get_tsharp8_image_info(PT:PTSharpResource8;hint:s_image_usage):TvImageKey; begin - Result:=_get_tsharp4_image_info(PTSharpResource4(PT)); + Result:=_get_tsharp4_image_info(PTSharpResource4(PT),hint); // Result.params.pitch:=PT^.pitch+1; // @@ -2369,14 +2372,14 @@ end; function _get_lod(w:Word):TVkFloat; forward; -function _get_tsharp4_image_view(PT:PTSharpResource4):TvImageViewKey; +function _get_tsharp4_image_view(PT:PTSharpResource4;hint:s_image_usage):TvImageViewKey; var t:Byte; begin Result:=Default(TvImageViewKey); if (PT=nil) then Exit; - Result.cformat:=_get_tsharp4_cformat(PT); + Result.cformat:=_get_tsharp4_cformat(PT,hint); Case PT^._type of SQ_RSRC_IMG_1D :Result.vtype:=ord(VK_IMAGE_VIEW_TYPE_1D); @@ -2423,9 +2426,9 @@ begin //Result.last_level:=0; ///// end; -function _get_tsharp8_image_view(PT:PTSharpResource8):TvImageViewKey; +function _get_tsharp8_image_view(PT:PTSharpResource8;hint:s_image_usage):TvImageViewKey; begin - Result:=_get_tsharp4_image_view(PTSharpResource4(PT)); + Result:=_get_tsharp4_image_view(PTSharpResource4(PT),hint); // Case PT^._type of SQ_RSRC_IMG_CUBE: diff --git a/vulkan/vShaderExt.pas b/vulkan/vShaderExt.pas index f52ae6ca..3afe1ae9 100644 --- a/vulkan/vShaderExt.pas +++ b/vulkan/vShaderExt.pas @@ -1482,6 +1482,7 @@ end; Procedure TvUniformBuilder.AddTSharp4(PT:PTSharpResource4;btype:TvBindImageType;fset,bind:DWord;flags:TvLayoutFlags); var b:TImageBindExt; + hint:s_image_usage; begin Assert(PT<>nil); if (PT=nil) then Exit; @@ -1494,8 +1495,16 @@ begin b.bind :=bind; b.memuse:=_get_buf_mem_usage(flags); - b.FImage:=_get_tsharp4_image_info(PT); - b.FView :=_get_tsharp4_image_view(PT); + if (btype in [vbStorage,vbMipStorage]) then + begin + hint:=[iu_storage]; + end else + begin + hint:=[]; + end; + + b.FImage:=_get_tsharp4_image_info(PT,hint); + b.FView :=_get_tsharp4_image_view(PT,hint); Insert(b,FImages,Length(FImages)); end; @@ -1503,6 +1512,7 @@ end; Procedure TvUniformBuilder.AddTSharp8(PT:PTSharpResource8;btype:TvBindImageType;fset,bind:DWord;flags:TvLayoutFlags); var b:TImageBindExt; + hint:s_image_usage; begin Assert(PT<>nil); if (PT=nil) then Exit; @@ -1515,8 +1525,16 @@ begin b.bind :=bind; b.memuse:=_get_buf_mem_usage(flags); - b.FImage:=_get_tsharp8_image_info(PT); - b.FView :=_get_tsharp8_image_view(PT); + if (btype in [vbStorage,vbMipStorage]) then + begin + hint:=[iu_storage]; + end else + begin + hint:=[]; + end; + + b.FImage:=_get_tsharp8_image_info(PT,hint); + b.FView :=_get_tsharp8_image_view(PT,hint); Insert(b,FImages,Length(FImages)); end;