Косячат дрова S3 и Voodoo; как пересобрать?


Автор темы
Вредятел
Сообщения: 94
Зарегистрирован: 23 янв 2012, 13:30

Re: Косячат дрова S3 и Voodoo; как пересобрать?

#11

Сообщение Вредятел » 21 мар 2013, 18:51

Кстати, проблема с вудушкой действительно копеечная. Там просто не проверяли состояние PCI FIFO, прежде чем писать. На тех машинах дремучих 90-х, когда 3dFX переживали свой золотой век, забить буфер просто не позволяла их скорость. Особенно учитывая то, что там вместо memcpy обычный for, совершенно не оптимизируемый компилятором под команды быстрого копирования памяти. Сейчас, когда извлечённый из пыльного чулана PCI 3dFX выполняет роль "протеза" для офисных машин с выгоревшей по той или иной причине PCIe, проблемка-то и выплыла -- быстрые они, не справляется буфер. Я исправил, надо это дело коммитить для всеобщего пользования, а как коммитить -- не представляю себе вообще.

В файле /src/voodoo_hardware.c вот этот обломус

Код: Выделить всё

/*
 *	Copiers for Voodoo1
 *
 *	Voodoo1 has no CPU to screen blit, and also lacks SGRAM fill
 */
 
void VoodooCopy16(VoodooPtr pVoo, CARD32 x1, CARD32 y1, CARD32 w, CARD32 h, CARD32 spitch, unsigned char *src)
{
	/* DWord copy pointer */
	CARD32 *out = (CARD32 *)(pVoo->FBBase + y1 * pVoo->Pitch + x1 *2);
	CARD32 *in = (CARD32 *)src;
	/* DWords to skip */
	CARD32 skipo = (pVoo->Pitch - w*2)>>2;
	CARD32 skipi = (pVoo->ShadowPitch - w*2)>>2;
	int ct;
	
	/* LFB will do all our work for us */

	mmio32_w(pVoo, 0x10C, 0);
	mmio32_w(pVoo, 0x110, (1<<9)|1);
	mmio32_w(pVoo, 0x114, (1<<8));
	while(h > 0)
	{
		for(ct = 0; ct < w; ct+=2)
			*out++=*in++;
		in += skipi;
		out += skipo;
		h--;
	}
}

/*
 *	Copiers for Voodoo 1 and Voodoo 2 24bit
 *
 *	Voodoo1 has no CPU to screen blit, and also lacks SGRAM fill
 *	Voodoo2 has no read side 24bit, nor 24bit accelerator
 */
 
void VoodooCopy24(VoodooPtr pVoo, CARD32 x1, CARD32 y1, CARD32 w, CARD32 h, CARD32 spitch, unsigned char *src)
{
	/* DWord copy pointer */
	CARD32 *out = (CARD32 *)(pVoo->FBBase + y1 * pVoo->Pitch + x1 * 4);
	CARD32 *in = (CARD32 *)src;
	/* DWords to skip */
	CARD32 skipo = (pVoo->Pitch - w*4)>>2;
	CARD32 skipi = (pVoo->ShadowPitch - w*4)>>2;
	int ct;
	
	/* LFB will do all our work for us */
	/* FIXME: Should we allow dither options ? */
	
	mmio32_w(pVoo, 0x10C, 0);
	mmio32_w(pVoo, 0x110, (1<<9)|1);
	mmio32_w(pVoo, 0x114, (1<<8)|4);
	while(h > 0)
	{
		for(ct = 0; ct < w; ct++)
			*out++=*in++;
		in += skipi;
		out += skipo;
		h--;
	}
}
меняем на вот такой вот код, исправленный согласно спецификации voodoo1/voodoo2 (благо этот регистр у них совпадает)

Код: Выделить всё

void inline memcpyFIFO (VoodooPtr pVoo, CARD32 *out, CARD32 *in, int ct)
{
	int Status;

	while (ct>0)	//any more left?
	{
		Status = mmio32_r(pVoo, 0);
		Status &= 0x3f;		//Free FIFO entries
		if (Status>ct) Status=ct;	//Don't write more than needed!
		memcpy (out,in,Status*4);
		out+=Status;
		in +=Status;
		ct -=Status;
	}
}

/*
 *	Copiers for Voodoo1
 *
 *	Voodoo1 has no CPU to screen blit, and also lacks SGRAM fill
 */

void VoodooCopy16(VoodooPtr pVoo, CARD32 x1, CARD32 y1, CARD32 w, CARD32 h, CARD32 spitch, unsigned char *src)
{
	/* DWord copy pointer */
	CARD32 *out = (CARD32 *)(pVoo->FBBase + y1 * pVoo->Pitch + x1 *2);
	CARD32 *in = (CARD32 *)src;
	/* DWords to skip */
	CARD32 lineo = (pVoo->Pitch)>>2;
	CARD32 linei = (pVoo->ShadowPitch)>>2;

	/* LFB will do all our work for us */

	mmio32_w(pVoo, 0x10C, 0);
	mmio32_w(pVoo, 0x110, (1<<9)|1);
	mmio32_w(pVoo, 0x114, (1<<8));

	while(h > 0)
	{
		memcpyFIFO (pVoo, out, in, w/2);

		in += linei;
		out += lineo;
		h--;
	}
}

/*
 *	Copiers for Voodoo 1 and Voodoo 2 24bit
 *
 *	Voodoo1 has no CPU to screen blit, and also lacks SGRAM fill
 *	Voodoo2 has no read side 24bit, nor 24bit accelerator
 */
 
void VoodooCopy24(VoodooPtr pVoo, CARD32 x1, CARD32 y1, CARD32 w, CARD32 h, CARD32 spitch, unsigned char *src)
{
	/* DWord copy pointer */
	CARD32 *out = (CARD32 *)(pVoo->FBBase + y1 * pVoo->Pitch + x1 * 4);
	CARD32 *in = (CARD32 *)src;
	/* DWords to skip */
	CARD32 lineo = (pVoo->Pitch)>>2;
	CARD32 linei = (pVoo->ShadowPitch)>>2;
	
	/* LFB will do all our work for us */
	/* FIXME: Should we allow dither options ? */
	
	mmio32_w(pVoo, 0x10C, 0);
	mmio32_w(pVoo, 0x110, (1<<9)|1);
	mmio32_w(pVoo, 0x114, (1<<8)|4);
	while(h > 0)
	{
		memcpyFIFO (pVoo, out, in, w);

		in += linei;
		out += lineo;
		h--;
	}
}
и пересобираем -- и горизонтальные полосы и всякая грязь, вызванная попытками записи в забитый буфер, пропадает с экрана быстро, решительно.

Итого в сухом остатке: horizontal streaks на voodoo устранены, S3 пока немного артачится и работать с ним в xinerama у меня согласился только на костылях, не являющихся общеприемлемыми. Сами понимаете, время на такую работу выделяется по остаточному принципу, так что никаких сроков не обещаю.


Автор темы
Вредятел
Сообщения: 94
Зарегистрирован: 23 янв 2012, 13:30

Re: Косячат дрова S3 и Voodoo; как пересобрать?

#12

Сообщение Вредятел » 22 мар 2013, 00:32

Если что, проблема с S3 такая: при малом объёме памяти драйвер занимается какой-то порнографией. Игнорируя заданную в xorg.conf цветовую глубину, тестирует разрешения (естественно, "на все деньги" -- 24bpp) и в результате те из них, которые тянут только в x16, попадают в недоступные. Ну, и выставляет потом "ближайшее доступное разрешение" с почтовую марку.
Я перевёл костыль из разряда неприемлемых в разряд условно-терпимых и на этом забиваю. Пусть дальше аццы чего-то делают, если хотят, а я проблему решил и работоспособную систему получил. Решение я прилагаю, его тоже хорошо бы закоммитить в какую-нибудь там альфу-бету, чтобы оно причесалось.


Автор темы
Вредятел
Сообщения: 94
Зарегистрирован: 23 янв 2012, 13:30

Re: Косячат дрова S3 и Voodoo; как пересобрать?

#13

Сообщение Вредятел » 22 мар 2013, 00:54

Что-то темка совсем выехала за рамки не то что раздела, а самого форума. Она уже не только Lubuntu затрагивает, а вообще иксы в целом.
Итак, правим src/s3_driver.c на такой вот предмет: заменяем это

Код: Выделить всё

typedef enum {
	OPTION_NOACCEL,
	OPTION_HWCURS,
	OPTION_SLOW_DRAM_REFRESH,
	OPTION_SLOW_DRAM,
	OPTION_SLOW_EDODRAM,
	OPTION_SLOW_VRAM,
	OPTION_XVIDEO,
	OPTION_SHADOW_FB,
	OPTION_ROTATE

} S3Opts;

static OptionInfoRec S3Options[] = {
	{ OPTION_NOACCEL, "noaccel", OPTV_BOOLEAN, {0}, FALSE },
	{ OPTION_HWCURS, "hwcursor", OPTV_BOOLEAN, {0}, FALSE },
	{ OPTION_SLOW_DRAM_REFRESH, "slow_dram_refresh", OPTV_BOOLEAN, {0}, FALSE },
	{ OPTION_SLOW_DRAM, "slow_dram", OPTV_BOOLEAN, {0}, FALSE },
	{ OPTION_SLOW_EDODRAM, "slow_edodram", OPTV_BOOLEAN, {0}, FALSE },
	{ OPTION_SLOW_VRAM, "slow_vram", OPTV_BOOLEAN, {0}, FALSE },
	{ OPTION_XVIDEO, "XVideo", OPTV_BOOLEAN, {0}, FALSE },
	{ OPTION_SHADOW_FB, "ShadowFB", OPTV_BOOLEAN, {0}, FALSE },
	{ OPTION_ROTATE, "Rotate", OPTV_ANYSTR, {0}, FALSE },

	{ -1, NULL, OPTV_NONE, {0}, FALSE }
};

RamDacSupportedInfoRec S3IBMRamdacs[] = {
	{ IBM524_RAMDAC },
	{ IBM524A_RAMDAC },
	{ IBM526_RAMDAC },
	{ IBM526DB_RAMDAC },
	{ -1 }
};

static int s3AccelLinePitches[] = { 640, 800, 1024, 1280, 1600 };

#ifdef XFree86LOADER

MODULESETUPPROTO(S3Setup);

static XF86ModuleVersionInfo S3VersRec = {
        "s3",
        MODULEVENDORSTRING,
        MODINFOSTRING1,
        MODINFOSTRING2,
        XORG_VERSION_CURRENT,
        VERSION_MAJOR, VERSION_MINOR, PATCHLEVEL,
        ABI_CLASS_VIDEODRV,
        ABI_VIDEODRV_VERSION,
        MOD_CLASS_VIDEODRV,
        {0, 0, 0, 0}
};


_X_EXPORT XF86ModuleData s3ModuleData = { &S3VersRec, S3Setup, NULL };

pointer S3Setup (pointer module, pointer opts, int *errmaj, int *errmin)
{
	static Bool setupDone = FALSE;

        if (!setupDone) {  
                setupDone = TRUE;
                xf86AddDriver(&S3, module, 0);
                return (pointer) 1;
        } else {
                if (errmaj)  
                        *errmaj = LDR_ONCEONLY;
                return NULL;
        }
}               

#endif /* XFree86LOADER */


static Bool S3GetRec(ScrnInfoPtr pScrn)
{       
        if (pScrn->driverPrivate)
                return TRUE;
                
        pScrn->driverPrivate = xnfcalloc(sizeof(S3Rec), 1);
                
        return TRUE;
}
                        
static void S3FreeRec(ScrnInfoPtr pScrn)
{
        if (!pScrn->driverPrivate)
                return;

        xfree(pScrn->driverPrivate);
        pScrn->driverPrivate = NULL;
}

static const OptionInfoRec * S3AvailableOptions(int chipid, int busid)
{
        return S3Options;
}
                
static void S3Identify(int flags)
{
        xf86PrintChipsets("S3", "driver (version " DRIVER_VERSION " for S3 chipset",
                          S3Chipsets);  
}

static Bool S3Probe(DriverPtr drv, int flags)
{
	GDevPtr *devSections;
	int i, *usedChips, numDevSections, numUsed;
	Bool foundScreen = FALSE;

	/* sanity check */
	if ((numDevSections = xf86MatchDevice("s3", &devSections)) <= 0)
                return FALSE;

	/* XXX do ISA later...  some day in the distant future... */
	numUsed = xf86MatchPciInstances("s3", PCI_VENDOR_S3,
					S3Chipsets, S3PciChipsets,
					devSections, numDevSections,
					drv, &usedChips);

	xfree(devSections);

	if (numUsed <= 0)
		return FALSE;

	if (flags & PROBE_DETECT)
		foundScreen = TRUE;
	else for (i=0; i<numUsed; i++) {
		ScrnInfoPtr pScrn = NULL;
                pScrn = xf86ConfigPciEntity(pScrn, 0, usedChips[i], S3PciChipsets,
                                          NULL, NULL, NULL, NULL, NULL);

		pScrn->driverVersion = VERSION_MAJOR;
		pScrn->driverName = DRIVER_NAME;
                pScrn->name = "s3";
                pScrn->Probe = S3Probe;
                pScrn->PreInit = S3PreInit;
                pScrn->ScreenInit = S3ScreenInit;  
                pScrn->SwitchMode = S3SwitchMode;
                pScrn->AdjustFrame = S3AdjustFrame;
                pScrn->EnterVT = S3EnterVT;
                pScrn->LeaveVT = S3LeaveVT;
		pScrn->FreeScreen = S3FreeScreen;

		foundScreen = TRUE;
        }
                
        xfree(usedChips);
                
        return foundScreen;
}

static Bool S3PreInit(ScrnInfoPtr pScrn, int flags)
{
	EntityInfoPtr pEnt;
	S3Ptr pS3;
	vgaHWPtr hwp;
	ClockRangePtr clockRanges;
	rgb zeros = {0, 0, 0};
	Gamma gzeros = {0.0, 0.0, 0.0};
	int i, vgaCRIndex, vgaCRReg;
	unsigned char tmp;
	char *s;


        if (flags & PROBE_DETECT)
                return FALSE;
        
        if (!xf86LoadSubModule(pScrn, "vgahw"))
                return FALSE;
        
        if (!vgaHWGetHWRec(pScrn))
                return FALSE;
        
        hwp = VGAHWPTR(pScrn);
        vgaHWGetIOBase(hwp);
        
        pScrn->monitor = pScrn->confScreen->monitor;
        
        if (!xf86SetDepthBpp(pScrn, 0, 0, 0, Support24bppFb | Support32bppFb))
	    return FALSE;



        switch (pScrn->depth) {
	case 8:
	case 15:
	case 16:
	case 24:
		/* OK */
		break;
	default:
		xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
			   "Given depth (%d) is not  supported by this driver\n",
			   pScrn->depth);
		return FALSE;
        }

        xf86PrintDepthBpp(pScrn);
        
        if (pScrn->depth > 8) {
                if (!xf86SetWeight(pScrn, zeros, zeros))
                        return FALSE;
        }

        if (!xf86SetDefaultVisual(pScrn, -1))
                return FALSE;
                                           
        pScrn->progClock = TRUE;
                 
        if (!S3GetRec(pScrn))
                return FALSE;

	pS3 = S3PTR(pScrn);

	pS3->s3Bpp = (pScrn->bitsPerPixel >> 3);

        xf86CollectOptions(pScrn, NULL);
        xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, S3Options);
         
	pS3->XVideo = xf86ReturnOptValBool(S3Options, OPTION_XVIDEO, TRUE);
	pS3->NoAccel = xf86ReturnOptValBool(S3Options, OPTION_NOACCEL, FALSE);
	pS3->HWCursor = xf86ReturnOptValBool(S3Options, OPTION_HWCURS, FALSE);
	pS3->SlowDRAMRefresh = xf86ReturnOptValBool(S3Options, OPTION_SLOW_DRAM_REFRESH, FALSE);
	pS3->SlowDRAM = xf86ReturnOptValBool(S3Options, OPTION_SLOW_DRAM, FALSE);
	pS3->SlowEDODRAM = xf86ReturnOptValBool(S3Options, OPTION_SLOW_EDODRAM, FALSE);
	pS3->SlowVRAM = xf86ReturnOptValBool(S3Options, OPTION_SLOW_VRAM, FALSE);
на вот такую брюкву:

Код: Выделить всё

typedef enum {
	OPTION_NOACCEL,
	OPTION_HWCURS,
	OPTION_SLOW_DRAM_REFRESH,
	OPTION_SLOW_DRAM,
	OPTION_SLOW_EDODRAM,
	OPTION_SLOW_VRAM,
	OPTION_XVIDEO,
	OPTION_SHADOW_FB,
	OPTION_ROTATE,
	OPTION_FORCE16
} S3Opts;

static OptionInfoRec S3Options[] = {
	{ OPTION_NOACCEL, "noaccel", OPTV_BOOLEAN, {0}, FALSE },
	{ OPTION_HWCURS, "hwcursor", OPTV_BOOLEAN, {0}, FALSE },
	{ OPTION_SLOW_DRAM_REFRESH, "slow_dram_refresh", OPTV_BOOLEAN, {0}, FALSE },
	{ OPTION_SLOW_DRAM, "slow_dram", OPTV_BOOLEAN, {0}, FALSE },
	{ OPTION_SLOW_EDODRAM, "slow_edodram", OPTV_BOOLEAN, {0}, FALSE },
	{ OPTION_SLOW_VRAM, "slow_vram", OPTV_BOOLEAN, {0}, FALSE },
	{ OPTION_XVIDEO, "XVideo", OPTV_BOOLEAN, {0}, FALSE },
	{ OPTION_SHADOW_FB, "ShadowFB", OPTV_BOOLEAN, {0}, FALSE },
	{ OPTION_ROTATE, "Rotate", OPTV_ANYSTR, {0}, FALSE },
	{ OPTION_FORCE16, "Force16", OPTV_BOOLEAN, {0}, FALSE },
	{ -1, NULL, OPTV_NONE, {0}, FALSE }
};

RamDacSupportedInfoRec S3IBMRamdacs[] = {
	{ IBM524_RAMDAC },
	{ IBM524A_RAMDAC },
	{ IBM526_RAMDAC },
	{ IBM526DB_RAMDAC },
	{ -1 }
};

static int s3AccelLinePitches[] = { 640, 800, 1024, 1280, 1600 };

#ifdef XFree86LOADER

MODULESETUPPROTO(S3Setup);

static XF86ModuleVersionInfo S3VersRec = {
        "s3",
        MODULEVENDORSTRING,
        MODINFOSTRING1,
        MODINFOSTRING2,
        XORG_VERSION_CURRENT,
        VERSION_MAJOR, VERSION_MINOR, PATCHLEVEL,
        ABI_CLASS_VIDEODRV,
        ABI_VIDEODRV_VERSION,
        MOD_CLASS_VIDEODRV,
        {0, 0, 0, 0}
};


_X_EXPORT XF86ModuleData s3ModuleData = { &S3VersRec, S3Setup, NULL };

pointer S3Setup (pointer module, pointer opts, int *errmaj, int *errmin)
{
	static Bool setupDone = FALSE;

        if (!setupDone) {  
                setupDone = TRUE;
                xf86AddDriver(&S3, module, 0);
                return (pointer) 1;
        } else {
                if (errmaj)  
                        *errmaj = LDR_ONCEONLY;
                return NULL;
        }
}               

#endif /* XFree86LOADER */


static Bool S3GetRec(ScrnInfoPtr pScrn)
{       
        if (pScrn->driverPrivate)
                return TRUE;
                
        pScrn->driverPrivate = xnfcalloc(sizeof(S3Rec), 1);
                
        return TRUE;
}
                        
static void S3FreeRec(ScrnInfoPtr pScrn)
{
        if (!pScrn->driverPrivate)
                return;

        xfree(pScrn->driverPrivate);
        pScrn->driverPrivate = NULL;
}

static const OptionInfoRec * S3AvailableOptions(int chipid, int busid)
{
        return S3Options;
}
                
static void S3Identify(int flags)
{
        xf86PrintChipsets("S3", "driver (version " DRIVER_VERSION " for S3 chipset",
                          S3Chipsets);  
}

static Bool S3Probe(DriverPtr drv, int flags)
{
	GDevPtr *devSections;
	int i, *usedChips, numDevSections, numUsed;
	Bool foundScreen = FALSE;

	/* sanity check */
	if ((numDevSections = xf86MatchDevice("s3", &devSections)) <= 0)
                return FALSE;

	/* XXX do ISA later...  some day in the distant future... */
	numUsed = xf86MatchPciInstances("s3", PCI_VENDOR_S3,
					S3Chipsets, S3PciChipsets,
					devSections, numDevSections,
					drv, &usedChips);

	xfree(devSections);

	if (numUsed <= 0)
		return FALSE;

	if (flags & PROBE_DETECT)
		foundScreen = TRUE;
	else for (i=0; i<numUsed; i++) {
		ScrnInfoPtr pScrn = NULL;
                pScrn = xf86ConfigPciEntity(pScrn, 0, usedChips[i], S3PciChipsets,
                                          NULL, NULL, NULL, NULL, NULL);

		pScrn->driverVersion = VERSION_MAJOR;
		pScrn->driverName = DRIVER_NAME;
                pScrn->name = "s3";
                pScrn->Probe = S3Probe;
                pScrn->PreInit = S3PreInit;
                pScrn->ScreenInit = S3ScreenInit;  
                pScrn->SwitchMode = S3SwitchMode;
                pScrn->AdjustFrame = S3AdjustFrame;
                pScrn->EnterVT = S3EnterVT;
                pScrn->LeaveVT = S3LeaveVT;
		pScrn->FreeScreen = S3FreeScreen;

		foundScreen = TRUE;
        }
                
        xfree(usedChips);
                
        return foundScreen;
}

static Bool S3PreInit(ScrnInfoPtr pScrn, int flags)
{
	EntityInfoPtr pEnt;
	S3Ptr pS3;
	vgaHWPtr hwp;
	ClockRangePtr clockRanges;
	rgb zeros = {0, 0, 0};
	Gamma gzeros = {0.0, 0.0, 0.0};
	int i, vgaCRIndex, vgaCRReg;
	unsigned char tmp;
	char *s;
	int Reinit=0;

        if (flags & PROBE_DETECT)
                return FALSE;
        
        if (!xf86LoadSubModule(pScrn, "vgahw"))
                return FALSE;
        
        if (!vgaHWGetHWRec(pScrn))
                return FALSE;
        
        hwp = VGAHWPTR(pScrn);
        vgaHWGetIOBase(hwp);
        
        pScrn->monitor = pScrn->confScreen->monitor;
        
        if (!xf86SetDepthBpp(pScrn, 0, 0, 0, Support24bppFb | Support32bppFb))
	    return FALSE;

Retry:

        switch (pScrn->depth) {
	case 8:
	case 15:
	case 16:
	case 24:
		/* OK */
		break;
	default:
		xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
			   "Given depth (%d) is not  supported by this driver\n",
			   pScrn->depth);
		return FALSE;
        }

        xf86PrintDepthBpp(pScrn);
        
        if (pScrn->depth > 8) {
                if (!xf86SetWeight(pScrn, zeros, zeros))
                        return FALSE;
        }

        if (!xf86SetDefaultVisual(pScrn, -1))
                return FALSE;
                                           
        pScrn->progClock = TRUE;
                 
        if (!S3GetRec(pScrn))
                return FALSE;

	pS3 = S3PTR(pScrn);

	pS3->s3Bpp = (pScrn->bitsPerPixel >> 3);

        xf86CollectOptions(pScrn, NULL);
        xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, S3Options);
         
	pS3->XVideo = xf86ReturnOptValBool(S3Options, OPTION_XVIDEO, TRUE);
	pS3->NoAccel = xf86ReturnOptValBool(S3Options, OPTION_NOACCEL, FALSE);
	pS3->HWCursor = xf86ReturnOptValBool(S3Options, OPTION_HWCURS, FALSE);
	pS3->SlowDRAMRefresh = xf86ReturnOptValBool(S3Options, OPTION_SLOW_DRAM_REFRESH, FALSE);
	pS3->SlowDRAM = xf86ReturnOptValBool(S3Options, OPTION_SLOW_DRAM, FALSE);
	pS3->SlowEDODRAM = xf86ReturnOptValBool(S3Options, OPTION_SLOW_EDODRAM, FALSE);
	pS3->SlowVRAM = xf86ReturnOptValBool(S3Options, OPTION_SLOW_VRAM, FALSE);

	if (xf86ReturnOptValBool(S3Options, OPTION_FORCE16, FALSE) && pScrn->depth > 16 && !Reinit)
	{
		if (!xf86SetDepthBpp(pScrn, 16, 16, 16, NoDepth24Support))
		{
			xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Couldn't re-init as Force16");
			return FALSE;
		}
		Reinit=1;
//Тут, вестимо, надо много чего деаллокатить и шатдаунить, прежде чем заново аллокатить и запускать.
//У меня прорезается чалма, как рыжая шерсть на ушах в НИИЧАВО, но я забиваю на утечку пары Кб.
		goto Retry;
	}
Пересобираем, без этой опции всё как и было (поэтому я отношу свою правку к условно-приемлемым для беты), с ней оно начинает хоть как-то работать, пусть и через кобру с дудкой.

Ну, и мой xorg.conf для xinerama с парой таких PCI-карточек.

Код: Выделить всё

Section "ServerLayout"
	Identifier     "X.org Configured"
	Screen      0  "Screen0" 0 0
	Screen      1  "Screen1" 1024 0
#	Screen      1  "Screen1" 0 768

	Option "Xinerama" "on"

# commented out by update-manager, HAL is now used and auto-detects devices
# Keyboard settings are now read from /etc/default/console-setup
#	InputDevice    "Mouse0" "CorePointer"
# commented out by update-manager, HAL is now used and auto-detects devices
# Keyboard settings are now read from /etc/default/console-setup
#	InputDevice    "Keyboard0" "CoreKeyboard"
EndSection

Section "Files"
	ModulePath   "/usr/lib/xorg/modules"
	FontPath     "/usr/share/fonts/X11/misc"
	FontPath     "/usr/share/fonts/X11/cyrillic"
	FontPath     "/usr/share/fonts/X11/100dpi/:unscaled"
	FontPath     "/usr/share/fonts/X11/75dpi/:unscaled"
	FontPath     "/usr/share/fonts/X11/Type1"
	FontPath     "/usr/share/fonts/X11/100dpi"
	FontPath     "/usr/share/fonts/X11/75dpi"
	FontPath     "/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType"
	FontPath     "built-ins"
EndSection

Section "Module"
	Load  "dbe"
	Load  "dri2"
	Load  "dri"
	Load  "extmod"
	Load  "glx"
	Load  "record"
EndSection

# commented out by update-manager, HAL is now used and auto-detects devices
# Keyboard settings are now read from /etc/default/console-setup
#Section "InputDevice"
#	Identifier  "Keyboard0"
#	Driver      "kbd"
#EndSection

# commented out by update-manager, HAL is now used and auto-detects devices
# Keyboard settings are now read from /etc/default/console-setup
#Section "InputDevice"
#	Identifier  "Mouse0"
#	Driver      "mouse"
#	Option	    "Protocol" "auto"
#	Option	    "Device" "/dev/input/mice"
#	Option	    "ZAxisMapping" "4 5 6 7"
#EndSection

Section "Monitor"
	Identifier "Monitor0"
	Option "NoDDC"
	HorizSync 30.0 - 79.0
	VertRefresh 50.0 - 70
	ModeLine "640x480@60" 25.2 640 656 752 800 480 490 492 525 -hsync -vsync
	ModeLine "800x600@60" 40.0 800 840 968 1056 600 601 605 628 +hsync +vsync
	ModeLine "1024x768@60" 65.0 1024 1048 1184 1344 768 771 777 806 -hsync -vsync
EndSection

Section "Monitor"
	Identifier "Monitor1"
	Option "NoDDC"
	HorizSync 30.0 - 79.0
	VertRefresh 50.0 - 70
	ModeLine "640x480@60" 25.2 640 656 752 800 480 490 492 525 -hsync -vsync
	ModeLine "800x600@60" 40.0 800 840 968 1056 600 601 605 628 +hsync +vsync
	ModeLine "1024x768@60" 65.0 1024 1048 1184 1344 768 771 777 806 -hsync -vsync
EndSection

Section "Device"
        ### Available Driver options are:-
        ### Values: <i>: integer, <f>: float, <bool>: "True"/"False",
        ### <string>: "String", <freq>: "<f> Hz/kHz/MHz",
        ### <percent>: "<f>%"
        ### [arg]: arg optional
        Option "ShadowFB" "True"
        Option "NoAccel" "True"
        #Option     "Rotate"             	# <str>
        #Option     "fbdev"              	# <str>
        #Option     "debug"              	# [<bool>]
	Identifier  "Card0"
	Driver      "voodoo"
	BusID       "PCI:5:7:0"
EndSection

Section "Device"
        ### Available Driver options are:-
        ### Values: <i>: integer, <f>: float, <bool>: "True"/"False",
        ### <string>: "String", <freq>: "<f> Hz/kHz/MHz",
        ### <percent>: "<f>%"
        ### [arg]: arg optional
        #Option     "ShadowFB"           	# [<bool>]
        #Option     "Rotate"             	# <str>
        #Option     "fbdev"              	# <str>
        #Option     "debug"              	# [<bool>]
        Option "Force16" "True"
	Identifier "Card1"
	Driver "s3"
	VendorName "S3 Inc."
	BoardName "s3trio"
	BusID       "PCI:5:6:0"
EndSection

Section "Screen"
	Identifier "Screen0"
	Device "Card0"
	Monitor "Monitor0"
	SubSection "Display"
		Viewport 0 0
		Depth 16
		Modes "1024x768"
	EndSubSection
EndSection

Section "Screen"
	Identifier "Screen1"
	Device "Card1"
	Monitor "Monitor1"
	SubSection "Display"
		Viewport 1024 0
#		Viewport 0 768
		Depth 16
		Modes "1024x768"
	EndSubSection
EndSection
Итого 2х1024х768х16 на два моника -- для офисной деятельности уже не вызывает рвотного отторжения.

Как это дело коммитить в проект и какими надо правами обладать (не думаю, что там любой евлампий феофилактович с улицы может правки вносить) я, повторюсь, не знаю. Если кто-нибудь донесёт сие до мейнстрима (особенно вудушку, на которую очень уж крепко и давно забили) -- мой поклон.


Автор темы
Вредятел
Сообщения: 94
Зарегистрирован: 23 янв 2012, 13:30

Re: Косячат дрова S3 и Voodoo; как пересобрать?

#14

Сообщение Вредятел » 22 мар 2013, 12:27

Я даже больше скажу: тему явно нужно перенести в "Разработка и тестирование". Мутировала в ходе эволюции-с.

Аватара пользователя

zhart
Администратор
Сообщения: 1637
Зарегистрирован: 16 дек 2010, 13:09
Контактная информация:

Re: Косячат дрова S3 и Voodoo; как пересобрать?

#15

Сообщение zhart » 22 мар 2013, 12:34

Перенес.


Автор темы
Вредятел
Сообщения: 94
Зарегистрирован: 23 янв 2012, 13:30

Re: Косячат дрова S3 и Voodoo; как пересобрать?

#16

Сообщение Вредятел » 22 мар 2013, 12:42

Данке :)


NicKSarD
Сообщения: 397
Зарегистрирован: 10 дек 2011, 10:09

Re: Косячат дрова S3 и Voodoo; как пересобрать?

#17

Сообщение NicKSarD » 23 мар 2013, 00:22

а вы батенька упорный я бы давно сменил материнскую плату. начальник не велит? а псией порт починить просто. замените конденсаторы вокруг него. даже если у них вид нормальный ;). (что поделать "китайские товары полное г@вно, но в них одна лишь прелесть- стоимость фуфло).


Автор темы
Вредятел
Сообщения: 94
Зарегистрирован: 23 янв 2012, 13:30

Re: Косячат дрова S3 и Voodoo; как пересобрать?

#18

Сообщение Вредятел » 24 мар 2013, 11:23

Даже не знаю, с чего начать, поэтому Буду Краток(ц): не угадал ни по одному пункту :) Вестимо, CRC у telepathic.so отвалился %)


Автор темы
Вредятел
Сообщения: 94
Зарегистрирован: 23 янв 2012, 13:30

Re: Косячат дрова S3 и Voodoo; как пересобрать?

#19

Сообщение Вредятел » 05 сен 2013, 11:15

Что-то в последней версии все иксы перекроили, ну да я багрепорт написал с полным решением, не буду больше пересобирать, заменю видюху на что-нибудь повеселее. Спортивная честь удовлетворена -- и хватит.
ЗЫ: имелась в виду вудушка, ессно.
Последний раз редактировалось Вредятел 26 янв 2014, 20:04, всего редактировалось 1 раз.


Автор темы
Вредятел
Сообщения: 94
Зарегистрирован: 23 янв 2012, 13:30

Re: Косячат дрова S3 и Voodoo; как пересобрать?

#20

Сообщение Вредятел » 26 янв 2014, 20:02

Итого в сухом остатке для 13.10. Поскольку замена коня на переправе продолжается, имейте в виду следующее.

Если драйвер s3 отказывается ставить разрешение, на которое у карты явно есть видеопамять (не ставит выше 640x480 или 800x600, когда, скажем, мастдай ставит 800x600 или 1024x768), следует применить следующий быстрый патч s3_driver.c:

@@ -328,1 +328,1 @@ static Bool S3PreInit(ScrnInfoPtr pScrn, int flags)
- if (!xf86SetDepthBpp(pScrn, 0, 0, 0, Support24bppFb | Support32bppFb))
+ if (!xf86SetDepthBpp(pScrn, 16, 16, 16, NoDepth24Support))

Я его заботливо подкинул в удачно попавший под руку .diff. Инструкция по сборке с первой страницы темы по-прежнему в силе, только имя драйвера другое ессно :) Это приучит его экономить видеопамять и не разбрасываться на 32-битные моды.

And, for our foreign comrades who can probably google this thread, a short translation. If your old s3 card does not work with high resolutions, use the one-line .diff pach above in this message on s3_driver.c source. It will permanently disable 32-bit modes, giving you higher resolutions instead.

Ответить