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

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

Мне нужен X11R6-7.0, поскольку драйверы катализатора ati не поддерживают более новые драйверы 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))

Структура LFBParameters

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

Ответы [ 3 ]

0 голосов
/ 02 января 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);

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

0 голосов
/ 13 марта 2011

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

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

0 голосов
/ 02 января 2011

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

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

...