A Modern GPGPU API & wip linux RDNA2+ Driver
rdna driver linux gpu
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

sdma more ops

+35
+30
libvektor/src/amdgpu/sdma_encoder.cpp
··· 12 12 #define BITFIELD64_MASK(b) \ 13 13 ((b) == 64 ? (~uint64_t(0)) : BITFIELD64_BIT((b) & 63) - 1) 14 14 15 + void SDMAEncoder::write_timestamp(uint64_t va) { 16 + SDMA_OPCODE_SEMAPHORE 17 + cs.emit(SDMA_PACKET(SDMA_OPCODE_TIMESTAMP, SDMA_TS_SUB_OPCODE_GET_GLOBAL_TIMESTAMP, 0)); 18 + cs.emit(va); 19 + cs.emit(va >> 32); 20 + } 21 + 22 + // @todo: taken from various drivers online... not mesa, weird! 23 + void SDMAEncoder::semaphore(uint64_t va) { 24 + cs.emit(SDMA_PACKET(SDMA_OPCODE_SEMAPHORE, 0, 0)); 25 + cs.emit(va); 26 + cs.emit(va >> 32); 27 + } 28 + 29 + void SDMAEncoder::fence(uint64_t va, uint32_t fence) { 30 + cs.emit(SDMA_PACKET(SDMA_OPCODE_FENCE, 0, SDMA_FENCE_MTYPE_UC)); 31 + cs.emit(va); 32 + cs.emit(va >> 32); 33 + cs.emit(fence); 34 + } 35 + 36 + void SDMAEncoder::wait_mem(uint32_t op, uint64_t va, uint32_t ref, uint32_t mask) { 37 + cs.emit(SDMA_PACKET(SDMA_OPCODE_POLL_REGMEM, 0, 0) | op << 28 | SDMA_POLL_MEM); 38 + cs.emit(va); 39 + cs.emit(va >> 32); 40 + cs.emit(ref); 41 + cs.emit(mask); 42 + cs.emit(SDMA_POLL_INTERVAL_160_CLK | SDMA_POLL_RETRY_INDEFINITELY << 16); 43 + } 44 + 15 45 uint64_t SDMAEncoder::constant_fill(uint64_t va, uint64_t size, uint32_t value) { 16 46 const uint32_t fill_size = 2; 17 47 const uint64_t max_fill_size = BITFIELD64_MASK(info.sdma_version >= SDMAVersion::SDMA_6_0 ? 30 : 22) & ~0x3;
+5
libvektor/src/amdgpu/sdma_encoder.h
··· 9 9 public: 10 10 SDMAEncoder(GpuInfo &info, CommandStream &cs); 11 11 12 + void write_timestamp(uint64_t va); 13 + void semaphore(uint64_t va); 14 + void fence(uint64_t va, uint32_t fence); 15 + void wait_mem(uint32_t op, uint64_t va, uint32_t ref, uint32_t mask); 16 + 12 17 // returns the number of bytes written; may need to be repeated. 13 18 uint64_t constant_fill(uint64_t va, uint64_t size, uint32_t value); 14 19 private: