hasvk: gen7'de fp64/int64/int16 ve 16-bit storage'i ac

Bu dort ozellik pdevice->info.ver >= 8 ile kapatilmisti. Kapi anv'den
miras; Ivy Bridge'den turetilmemis. IVB PRM ve elk'in kendi register
tablolari aksini soyluyor:

  fp64   -> gfx7_hw_type[] icinde DF var        : native
  int16  -> W / UW var                          : native
  int64  -> Q / UQ yok (gen8+)                  : nir_lower_int64 ile
  fp16   -> HF yok                              : gercekten yok, false kalir

16-bit bellek erisimi icin gereken indirgeme zaten kuruluydu:
elk_nir.c:get_mem_access_size_align() verx10 < 75 icin her sub-dword
erisimi 32-bit dword'e ceviriyor (load'da shift+extract, store'da atomic
RMW). f16<->f32 donusum komutlari da IVB'de mevcut.

VK-GL-CTS ile olculdu (8086:0166, IVB GT2):
  fp64  : 9402 vaka -> 3975 Pass, 20 Fail (hepsi float_controls kenar
          durumu: vertex'te dot/normalize ve rounding_rtz_round_ev)
  int64 : spirv_assembly.type.{scalar,vec2} -> 160 Pass, 0 Fail
          (vertex varyantlari vertexPipelineStoresAndAtomics'ten atliyor)
  16-bit: daha once 948/948 atlanan set -> 500 Pass, 0 Fail

int16 CTS ile tek basina sinanamiyor (her 16-bit vakasi ayrica
uniformAndStorageBuffer16BitAccess istiyor), dayanak register tablosu.

fp64 float-controls ozellikleri true birakildi; gen7'de calismalarinin
sarti olan vec4 FLOAT_CONTROL_MODE emisyonu ayri commit'te eklendi.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
elwrclandClaude Opus 5 committed 2026-09-21 22:56:09 +03:00
1 parent 64632dfceb
commit 6000949371
1 file changed
+27 -6
+27 -6
View File
@@ -439,17 +439,30 @@ get_features(const struct anv_physical_device *pdevice,
.shaderStorageImageArrayDynamicIndexing = true, .shaderStorageImageArrayDynamicIndexing = true,
.shaderClipDistance = true, .shaderClipDistance = true,
.shaderCullDistance = true, .shaderCullDistance = true,
.shaderFloat64 = pdevice->info.ver >= 8 && /* DENEY: bu ucu anv'den ver >= 8 sartiyla miras alinmisti. Gen7'de
pdevice->info.has_64bit_float, * has_64bit_float zaten true ve crocus ayni donanimda
.shaderInt64 = pdevice->info.ver >= 8, * GL_ARB_gpu_shader_fp64 sunuyor, yani elk fp64 kodu uretebiliyor.
.shaderInt16 = pdevice->info.ver >= 8, * int64/int16 icin donanim destegi yok ama elk_compiler.c:62 civarinda
* eksik olani nir_lower_*64/16 ile yazilima indirgiyor. CTS ile
* dogrulanacak; gerilerse geri alinir. */
.shaderFloat64 = pdevice->info.has_64bit_float,
.shaderInt64 = true,
.shaderInt16 = true,
.shaderResourceMinLod = false, .shaderResourceMinLod = false,
.variableMultisampleRate = true, .variableMultisampleRate = true,
.inheritedQueries = true, .inheritedQueries = true,
/* Vulkan 1.1 */ /* Vulkan 1.1 */
.storageBuffer16BitAccess = pdevice->info.ver >= 8 && !pdevice->instance->no_16bit, /* DENEY: gen7'de de aciliyor. 16-bit bellek erisimi icin gereken
.uniformAndStorageBuffer16BitAccess = pdevice->info.ver >= 8 && !pdevice->instance->no_16bit, * indirgeme zaten kurulu -- elk_nir.c:get_mem_access_size_align()
* verx10 < 75 icin her sub-dword erisimi 32-bit dword'e cevirip
* load'da shift+extract, store'da atomic RMW uretiyor. 16-bit tamsayi
* ALU'su gen7'de native (gfx7_hw_type[] W/UW), fp16 ALU'su ise
* lower_bit_size_callback tarafindan 32-bit'e indirgeniyor ve
* f16to32/f32to16 donusum komutlari IVB'de mevcut.
* CTS ile dogrulanacak; gerilerse geri alinir. */
.storageBuffer16BitAccess = !pdevice->instance->no_16bit,
.uniformAndStorageBuffer16BitAccess = !pdevice->instance->no_16bit,
.storagePushConstant16 = pdevice->info.ver >= 8, .storagePushConstant16 = pdevice->info.ver >= 8,
.storageInputOutput16 = false, .storageInputOutput16 = false,
.multiview = true, .multiview = true,
@@ -882,6 +895,14 @@ get_properties_1_2(const struct anv_physical_device *pdevice,
p->shaderRoundingModeRTZFloat32 = true; p->shaderRoundingModeRTZFloat32 = true;
p->shaderSignedZeroInfNanPreserveFloat32 = true; p->shaderSignedZeroInfNanPreserveFloat32 = true;
/* Gen7 DF float-controls'u donanimda destekliyor: IVB PRM vol4 part3,
* CR0 bit 6 "Double Precision Denorm Mode" ve bit 5:4 "Rounding Mode".
* Eksik olan derleyici tarafiydi -- vec4 arka ucu (VS/GS/TCS/TES) yalnizca
* RND_MODE emit ediyor, denorm modunu hic yazmiyordu. Bu artik
* vec4_visitor::emit_shader_float_controls_execution_mode() icinde
* FLOAT_CONTROL_MODE ile duzeltildi, dolayisiyla bu dordu gen7'de de
* dogru sekilde vaat edilebiliyor.
*/
p->shaderDenormFlushToZeroFloat64 = true; p->shaderDenormFlushToZeroFloat64 = true;
p->shaderDenormPreserveFloat64 = true; p->shaderDenormPreserveFloat64 = true;
p->shaderRoundingModeRTEFloat64 = true; p->shaderRoundingModeRTEFloat64 = true;