1

我正在尝试在 Ubuntu maverick 下编译 X11R6-7.0,但遇到了一些我无法解决的奇怪编译错误。

我需要 X11R6-7.0,因为 ati 催化剂驱动程序不支持更新的 xorg 和 oss 驱动程序不支持我的硬件的 3d 加速。

有谁知道这个错误信息是什么意思?我知道一些C,但我有点困惑。这是否意味着GET_FB_DATA宏返回NULL或某些方法/属性未设置?

任何进一步了解如何在这一点上“调试”预处理器定义都会很棒。我不认为我可以打印任何有用的东西#error

我得到的错误:

tdfx_span.c:在函数“tdfxDDWriteDepthPixels”中:
tdfx_span.c:976:错误:需要左值作为赋值的左操作数
tdfx_span.c:1008:错误:需要左值作为赋值的左操作数
tdfx_span.c:在函数“write_stencil_pixels”中:
tdfx_span.c:1242:错误:需要左值作为赋值的左操作数

编码:

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;
4

3 回答 3

0

不,这当然不是因为指针是0. 这表明一个类型是错误的。正如消息所说,您需要在分配左侧有一个左值。(这听起来很正常,不是吗?)

我猜想某个宏以某种方式返回了一个指针值,而您却错过了取消引用它。

于 2011-01-02T13:25:34.800 回答
0

你可能不会喜欢听到这个,但 X11R6 以大多数标准来看是古老的。你有哪个视频卡,为什么需要 fglrx?看看我的墙,我没有任何需要 fglrx 的 ATI/AMD 芯片组;只有最新的芯片组,比如 Cayman,才需要它,而且这些芯片组的 fglrx 无论如何都不会建立在 X11R6 上。

无论如何,如果您绝对坚持这样做,您可能应该使用 --with-dri-drivers=swrast 构建台面,因为这将阻止构建像 tdfx_dri 这样的驱动程序。当然,您也没有需要加速的 Voodoo,对吗?:3

于 2011-03-13T19:42:29.303 回答
0

您的宏扩展为:

(
(
  ((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);

我认为这是不正确的并导致了问题。这是你所期待的吗?

于 2011-01-02T17:49:34.050 回答