Предотвращенный металлом режим адреса устройства - PullRequest
0 голосов
/ 25 августа 2018

Я создаю графическое приложение, которое использует Metal для рендеринга всего.Когда я выполнял отладку фрейма под конвейерной статистикой для всех моих вызовов отрисовки, есть !!Приоритетное предупреждение под названием «Запрещенная загрузка режима адреса устройства» с подробной информацией:

Indexing using unsigned int for offset prevents addressing calculation in device. To prevent this extra ALU operation use int for offset.

Итак, для моего самого простого вызова отрисовки, который включает в себя это, то, что происходит.Существует большое количество данных вершин, за которыми следует индексный буфер.Индексный буфер создается и заполняется в начале, а затем становится постоянным.Все данные вершин постоянно меняются.

У меня есть следующие типы:

struct Vertex {
    float3 data;
};
typedef int32_t indexType; 

Затем следующий вызов отрисовки

[encoder drawIndexedPrimitives:MTLPrimitiveTypeTriangle indexCount:/*int here*/ indexType:MTLIndexTypeUInt32 indexBuffer:indexBuffer indexBufferOffset:0];

, который переходит к следующей функции вершины

vertex VertexOutTC vertex_fun(constant Vertex * vertexBuffer [[ buffer(0) ]],
                                indexType vid [[ vertex_id ]],
                                 constant matrix_float3x3* matrix [[buffer(1)]]) {

    const float2 coords[] = {float2(-1, -1), float2(-1, 1), float2(1, -1), float2(1, 1)};
    CircleVertex vert = vertexBuffer[vid];
    VertexOutTC out;
    out.position = float4((*matrix * float3(vert.data.x, vert.data.y, 1.0)).xy, ((float)((int)vid/4))/10000.0, 1.0);
    out.color = HSVtoRGB(vert.data.z, 1.0, 1.0);
    out.tc = coords[vid % 4];
    return out;
}

Я очень смущен, что именно я делаю здесь неправильно.Казалось бы, ошибка говорит о том, что я не должен использовать тип без знака для смещения, которое, как я предполагаю, является индексным буфером.

Дело в том, что в конечном итоге для индексного буфера есть только MTLIndexTypeUInt32 и MTLIndexTypeUInt16 обаиз которых не подписаны.Кроме того, если я попытаюсь использовать raw int в качестве типа, шейдер не будет компилироваться.Что здесь происходит?

...