Как вызвать функцию glMultiDrawElements :: GLenum -> GHC.Ptr.Ptr GLsizei -> GLenum -> GHC.Ptr.Ptr (GHC.Ptr.Ptr a) -> GLsizei -> IO () - PullRequest
0 голосов
/ 13 июля 2011

Для функции glMultiDrawElements требуется указатель на указатель в качестве одного из аргументов. Как можно получить Ptr(Ptr a) в StorableArray Int a?

1 Ответ

3 голосов
/ 13 июля 2011

Вам необходимо сначала упорядочить свои списки индексов в Ptr, а затем упорядочить эти Ptr в Ptr (Ptr Int))

. Вы можете сделать что-то подобное

import Foreign.Marshal.Array

indices :: [[Int]]

do
  ixPtrs <- mapM newArray indices
  sizes  <- newArray $ map (fromIntegral . length) indices
  ixPtrPtr <- newArray ixPtrs
  glMultiDrawElements enumType sizes iType ixPtrPtr (fromIntegral $ length indices)

  mapM_ free ixPtrs
  free ixPtrPtr
  free sizes

Здесь список Ptr s все еще находится в области видимости, поэтому мы можем отобразить поверх него M, чтобы освободить каждый указатель.Если вы хотите освободить память позже, вы можете сохранить список или оставить ixPtrPtr и использовать peekArray, чтобы вернуть исходные указатели.

...