Czy mogę debugować mój kod języka cieniowania przy użyciu wyjścia konsoli (np. print
w Swift)?Metal Shading Language - (Console) Output?
Jeśli tak, w jaki sposób?
Jeśli nie, czy istnieją inne sposoby wyprowadzania zmiennych z mojego pliku .metal? (Może przekazując dane z pliku .metal do mojego pliku .swift przy użyciu poleceniaEncoder-buffer?)
Bezskutecznie próbowałem przekazać odwołanie do zmiennej Int (która znajduje się w moim pliku .swift) za pomocą poleceniaEncoder do mojego pliku .metal. W pliku .metal przypisuję wartość do zmiennej int, ale jeśli wydrukuję Int w moim pliku swift, przypisana wartość nie istnieje.
plik .swift:
...
var myMetalOutput: Int = 0
...
let printBuffer = device.newBufferWithBytes(&myMetalOutput, length: sizeof(Int), options: MTLResourceOptions.CPUCacheModeDefaultCache)
commandEncoder.setBuffer(printBuffer, offset: 0, atIndex: 8)
...
commandBuffer.commit()
drawable.present()
print("myMetalOutput: \(myMetalOutput)")
...
.metal file:
...
kernel void shader(..., device int &printBuffer [[8]], ...) {
...
printBuffer = 123;
...
}
Wyjście konsola jest zawsze myMetalOutput: 0
Ta odpowiedź nie jest kompletna. Mówisz tylko, że użycie 'newBufferWithBytes' jest niepoprawne, ale nie pisz tego, czego chcesz użyć. Odpowiedź brzmi prawdopodobnie "newBufferWithBytesNoCopy", ale to nadal nie rozwiązuje problemu, próbuję zwrócić wartość do wydrukowania za pomocą tego i 'addCompletedHandler' i nadal drukuje 0. – Ixx
Wygląda na to, że PO uznał tę odpowiedź za kompletną, ze względu na akceptację. Wygląda na to, że możesz mieć nieco inny przypadek użycia, dla którego prawdopodobnie powinieneś otworzyć nowe pytanie. – warrenm
Mam dokładnie taki sam przypadek użycia, otwarcie nowego pytania zostanie oznaczone jako duplikat, więc myślę, że problem leży w tej odpowiedzi. – Ixx