Запрещенный псевдоним в glGetActiveUniform - PullRequest
2 голосов
/ 17 июня 2020

API Android OpenGL имеет тенденцию использовать комбинации массивов и смещений в тех местах, где C API будет использовать указатели. Есть ли что-нибудь в документации Android, чтобы сказать, что незаконно передавать один и тот же массив в качестве нескольких аргументов такой функции?

Я слишком долго отлаживал следующий (Kotlin) код :

val queryResults = IntArray(3)
GLES20.glGetActiveUniform(
    handle, index, nameBuf.size,
    queryResults, 0, // length
    queryResults, 1, // size
    queryResults, 2, // type
    nameBuf, 0)
val length = queryResults[0]
val size = queryResults[1]
val type = queryResults[2]

Я надеялся избежать выделения двух массивов (и влечет за собой затирание пространства имен) путем повторного использования одного трехэлементного вектора для всех трех выходных параметров значения int. Но мне кажется, что на самом деле модифицируется только первый элемент массива. Второй и третий аргументы остаются в том значении, которое они имели до вызова функции. Почему?

В Android Kotlin документации ничего не говорится, кроме сигнатуры функции и имен аргументов. Java версия больше не нужна. Документация OpenGL описывает функцию с точки зрения трех отдельных указателей без дополнительных требований.

У меня есть исправление, заключающееся в использовании одного массива для каждого выходного аргумента, но я действительно хотел бы понять зачем это нужно. Во всем переводе API может быть что-то, чего я не понимаю, и это мне пригодится, когда я буду продолжать работать с ним.

val lengthBuf = IntArray(1)
val sizeBuf = IntArray(1)
val typeBuf = IntArray(1)
GLES20.glGetActiveUniform(
    handle, index, nameBuf.size,
    lengthBuf, 0, // length
    sizeBuf, 0, // size
    typeBuf, 0, // type
    nameBuf, 0)
val length = lengthBuf[0]
val size = sizeBuf[0]
val type = typeBuf[0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...