Открытие определений макросов: tdfx_span.c: lvalue требуется в качестве левого операнда присваивания

Я пытаюсь скомпилировать X11R6-7.0 под Ubuntu Maverick и получил несколько странных ошибок компиляции, которые не могу решить самостоятельно.

Мне понадобился X11R6-7.0, поскольку драйверы ati Catalyst не поддерживают новые версии xorg, а драйверы oss не поддерживают 3D-ускорение моего оборудования.

Кто-нибудь знает, что означает это сообщение об ошибке? Я немного знаю C, но немного запутался. Означает ли это, что макрос GET_FB_DATA вернул NULL или какой-то метод/свойство не установлено?

Любое дальнейшее понимание того, как «отлаживать» определения препроцессора на этом этапе, было бы здорово. Я не думаю, что смогу напечатать что-нибудь полезное с помощью #error.

Ошибка, которую я получаю:

tdfx_span.c: В функции 'tdfxDDWriteDepthPixels':
tdfx_span.c:976: ошибка: lvalue требуется в качестве левого операнда присваивания
tdfx_span.c:1008: ошибка: lvalue требуется в качестве левого операнда присваивания
tdfx_span .c: В функции 'write_stencil_pixels':
tdfx_span.c:1242: ошибка: в качестве левого операнда присваивания требуется lvalue

код:

958-   switch (depth_size) {
959-   case 16:
960-      GetBackBufferInfo(fxMesa, &backBufferInfo);
961-      /*
962-       * Note that the _LOCK macro adds a curly brace,
963-       * and the UNLOCK macro removes it.
964-       */
965-      WRITE_FB_SPAN_LOCK(fxMesa, info,
966-             GR_BUFFER_AUXBUFFER, GR_LFBWRITEMODE_ANY);
967-      {
968-     LFBParameters ReadParams;
969-     GetFbParams(fxMesa, &info, &backBufferInfo,
970-             &ReadParams, sizeof(GLushort));
971-     for (i = 0; i < n; i++) {
972-        if (mask[i] && visible_pixel(fxMesa, x[i], y[i])) {
973-           xpos = x[i] + fxMesa->x_offset;
974-           ypos = bottom - y[i];
975-           d16 = depth[i];
976:           PUT_FB_DATA(&ReadParams, GLushort, xpos, ypos, d16);
977-        }
978-     }
979-      }
980-      WRITE_FB_SPAN_UNLOCK(fxMesa, GR_BUFFER_AUXBUFFER);
981-      break;
982-   case 24:

И относительные макросы:

#define GET_FB_DATA(ReadParamsp, type, x, y)                        \
   (((x) < (ReadParamsp)->firstWrappedX)                            \
        ? (((type *)((ReadParamsp)->lfbPtr))                        \
                 [(y) * ((ReadParamsp)->LFBStrideInElts)            \
                   + (x)])                                          \
        : (((type *)((ReadParamsp)->lfbWrapPtr))                    \
                 [((y)) * ((ReadParamsp)->LFBStrideInElts)          \
                   + ((x) - (ReadParamsp)->firstWrappedX)]))
#define GET_ORDINARY_FB_DATA(ReadParamsp, type, x, y)               \
    (((type *)((ReadParamsp)->lfbPtr))                              \
                 [(y) * ((ReadParamsp)->LFBStrideInElts)            \
                   + (x)])
#define GET_WRAPPED_FB_DATA(ReadParamsp, type, x, y)                \
    (((type *)((ReadParamsp)->lfbWrapPtr))                          \
                 [((y)) * ((ReadParamsp)->LFBStrideInElts)          \
                   + ((x) - (ReadParamsp)->firstWrappedX)])
#define PUT_FB_DATA(ReadParamsp, type, x, y, value)                        \
    (GET_FB_DATA(ReadParamsp, type, x, y) = (type)(value))
#define PUT_ORDINARY_FB_DATA(ReadParamsp, type, x, y, value)              \
    (GET_ORDINARY_FB_DATA(ReadParamsp, type, x, y) = (type)(value))
#define PUT_WRAPPED_FB_DATA(ReadParamsp, type, x, y, value)                \
    (GET_WRAPPED_FB_DATA(ReadParamsp, type, x, y) = (type)(value))

Структура параметров LFB

483-typedef struct
484-{
485-   void *lfbPtr;
486-   void *lfbWrapPtr;
487-   FxU32 LFBStrideInElts;
488-   GLint firstWrappedX;
489-}
490:LFBParameters;

person Antti Rytsölä    schedule 02.01.2011    source источник


Ответы (3)


Нет, конечно, это не потому, что указатель — это 0. Это указывает на неправильный тип. Как говорится в сообщении, вам нужно lvalue слева от присваивания. (что звучит нормально, не так ли?)

Я предполагаю, что каким-то образом один из макросов возвращает значение указателя, и вам не хватает его разыменования.

person Jens Gustedt    schedule 02.01.2011

Ваш макрос расширяется до:

(
(
  ((xpos) < (&ReadParams)->firstWrappedX) ?
  (((GLushort *)((&ReadParams)->lfbPtr)) [(ypos) * ((&ReadParams)->LFBStrideInElts) + (xpos)])
  :
  (((GLushort *)((&ReadParams)->lfbWrapPtr)) [((ypos)) * ((&ReadParams)->LFBStrideInElts) + ((xpos) - (&ReadParams)->firstWrappedX)])) = (GLushort)(d16)
);

Итак, в основном это делается (что-то вроде):

   ((GLushort *)((&ReadParams)->lfbWrapPtr))[SOME_INDEX] = (GLushort)(d16);

Что я не считаю правильным и вызывает проблему. Это то, что вы ожидаете?

person Vikram.exe    schedule 02.01.2011

Вам, вероятно, не понравится это слышать, но X11R6 по большинству стандартов устарел. Какая у вас видеокарта и зачем нужен fglrx? Глядя на мою стену, у меня нет чипсетов ATI/AMD, для которых требуется fglrx; это требуется только для самых новых чипсетов, таких как Cayman, и fglrx для этих чипсетов все равно не будет строиться на X11R6.

В любом случае, если вы абсолютно настаиваете на этом, вам, вероятно, следует собрать mesa с параметром --with-dri-drivers=swrast, так как это предотвратит сборку таких драйверов, как tdfx_dri. Наверняка у вас нет Voodoo, который тоже нужно ускорять, верно? :3

person Corbin    schedule 13.03.2011