Я написал ядро OpenCL, которое использует совместимость opencl-opengl для чтения вершин и индексов, но, вероятно, это даже не важно, потому что я просто выполняю простое добавление указателя, чтобы получить конкретную вершину по индексу.
uint pos = (index + base)*stride;
Здесь я вычисляю абсолютную позицию в байтах, в моем примере pos — это 28 643 328 с шагом 28, index = 0 и base = 1 022 976. Что ж, это кажется правильным.
К сожалению, я не могу использовать vload3
напрямую, потому что параметр смещения не вычисляется как абсолютный адрес в байтах. Поэтому я просто добавляю pos
к указателю void* vertices_gl
void* new_addr = vertices_gl+pos;
new_addr
в моем примере = 0x2f90000 и здесь начинается странная часть,
vertices_gl
= 0x303f000
Результат (new_addr
) должен быть 0x4B90000 (0x303f000 + 28 643 328)
Я не понимаю, почему адрес vertices_gl уменьшается на 716 800 (0xAF000)
Я ориентируюсь на GPU: AMD Radeon HD5830
Ps: для тех, кто интересуется, я использую printf для получения этих значений :) (не удалось заставить работать CodeXL)
base + index * stride
. Но кроме этого, я не вижу здесь ничего плохого, предполагая, чтоvertices_gl
является указателем, а арифметика указателей работает в OpenCL так же, как и в C. - person Victor Zamanian   schedule 16.06.2013