nvidiaacceleration.java

来自「纯java操作系统jnode,安装简单和操作简单的个人使用的Java操作系统」· Java 代码 · 共 856 行 · 第 1/3 页

JAVA
856
字号
				setACC(NVACC_PR_CTX1_1, 0x00000c02); /* format is X16RGB16, LSB mono */
				setACC(NVACC_PR_CTX1_2, 0x00000b02); /* format is A16RGB16, LSB mono */
				setACC(NVACC_PR_CTX1_3, 0x00000c02); /* format is X16RGB16, LSB mono */
				setACC(NVACC_PR_CTX1_4, 0x00000c02); /* format is X16RGB16, LSB mono */
				setACC(NVACC_PR_CTX1_5, 0x00000c02); /* format is X16RGB16, LSB mono */
				setACC(NVACC_PR_CTX1_9, 0x00000c02); /* format is X16RGB16, LSB mono */
				setACC(NVACC_PR_CTX2_9, 0x00000c02); /* dma_instance 0 valid, instance 1 invalid */
				if (architecture == NV04A) {
					setACC(NVACC_PR_CTX1_B, 0x00000702); /* format is X1RGB15, LSB mono */
					setACC(NVACC_PR_CTX1_C, 0x00000702); /* format is X1RGB15, LSB mono */
				} else {
					setACC(NVACC_PR_CTX1_B, 0x00000c02); /* format is X16RGB16, LSB mono */
					setACC(NVACC_PR_CTX1_C, 0x00000c02); /* format is X16RGB16, LSB mono */
					setACC(NVACC_PR_CTX1_E, 0x00000c02); /* format is X16RGB16, LSB mono */
				}
				setACC(NVACC_PR_CTX1_D, 0x00000c02); /* format is X16RGB16, LSB mono */
				break;
			case 32 :
				/* acc engine */
				setACC(NVACC_FORMATS, 0x000070e5);
				if (architecture < NV30A)
					setACC(NVACC_BPIXEL, 0x0077d777); /* set depth 0-5: 4 bits per color */
				else
					setACC(NVACC_BPIXEL, 0x000000e7); /* set depth 0-1: 5 bits per color */
				setACC(NVACC_STRD_FMT, 0x0e0d0d0d);
				/* PRAMIN */
				setACC(NVACC_PR_CTX1_0, 0x00000e02); /* format is X8RGB24, LSB mono */
				setACC(NVACC_PR_CTX1_1, 0x00000e02); /* format is X8RGB24, LSB mono */
				setACC(NVACC_PR_CTX1_2, 0x00000d02); /* format is A8RGB24, LSB mono */
				setACC(NVACC_PR_CTX1_3, 0x00000e02); /* format is X8RGB24, LSB mono */
				setACC(NVACC_PR_CTX1_4, 0x00000e02); /* format is X8RGB24, LSB mono */
				setACC(NVACC_PR_CTX1_5, 0x00000e02); /* format is X8RGB24, LSB mono */
				setACC(NVACC_PR_CTX1_9, 0x00000e02); /* format is X8RGB24, LSB mono */
				setACC(NVACC_PR_CTX2_9, 0x00000e02); /* dma_instance 0 valid, instance 1 invalid */
				setACC(NVACC_PR_CTX1_B, 0x00000e02); /* format is X8RGB24, LSB mono */
				setACC(NVACC_PR_CTX1_C, 0x00000e02); /* format is X8RGB24, LSB mono */
				setACC(NVACC_PR_CTX1_D, 0x00000e02); /* format is X8RGB24, LSB mono */
				if (architecture >= NV10A)
					setACC(NVACC_PR_CTX1_E, 0x00000e02); /* format is X8RGB24, LSB mono */
				break;
			default :
				throw new IllegalArgumentException("ACC: init, invalid bit depth " + bitsPerPixel);
		}

		/* setup some extra stuff for NV30A */
		if (architecture == NV30A) {
			/*
			 * fixme: Does not belong here (and not needed?) if(!chip->flatPanel) { chip->PRAMDAC0[0x0578/4] = state->vpllB; //0x00680578 = ??? never modified! chip->PRAMDAC0[0x057C/4] =
			 * state->vpll2B; //0x0068057c = ??? never modified! }
			 */

			/* activate Zcullflush(?) */
			setACC(NVACC_DEBUG3, (getACC(NVACC_DEBUG3) | 0x00000001));
			/* unknown */
			setACC(NVACC_NV30_WHAT, (getACC(NVACC_NV30_WHAT) | 0x00040000));
		}

		/** * setup screen location and pitch ** */
		switch (architecture) {
			case NV04A :
			case NV10A :
				/* location of active screen in framebuffer */
				setACC(NVACC_OFFSET0, frameBufferOffset);
				setACC(NVACC_OFFSET1, frameBufferOffset);
				setACC(NVACC_OFFSET2, frameBufferOffset);
				setACC(NVACC_OFFSET3, frameBufferOffset);
				setACC(NVACC_OFFSET4, frameBufferOffset);
				setACC(NVACC_OFFSET5, frameBufferOffset);

				/* setup buffer pitch */
				setACC(NVACC_PITCH0, bytesPerRow & 0x0000ffff);
				setACC(NVACC_PITCH1, bytesPerRow & 0x0000ffff);
				setACC(NVACC_PITCH2, bytesPerRow & 0x0000ffff);
				setACC(NVACC_PITCH3, bytesPerRow & 0x0000ffff);
				setACC(NVACC_PITCH4, bytesPerRow & 0x0000ffff);
				break;
			case NV20A :
			case NV30A :
				/* location of active screen in framebuffer */
				setACC(NVACC_NV20_OFFSET0, frameBufferOffset);
				setACC(NVACC_NV20_OFFSET1, frameBufferOffset);
				setACC(NVACC_NV20_OFFSET2, frameBufferOffset);
				setACC(NVACC_NV20_OFFSET3, frameBufferOffset);

				/* setup buffer pitch */
				setACC(NVACC_NV20_PITCH0, bytesPerRow & 0x0000ffff);
				setACC(NVACC_NV20_PITCH1, bytesPerRow & 0x0000ffff);
				setACC(NVACC_NV20_PITCH2, bytesPerRow & 0x0000ffff);
				setACC(NVACC_NV20_PITCH3, bytesPerRow & 0x0000ffff);
				break;
		}

		/** * setup tile and pipe stuff ** */
		if (architecture >= NV10A) {
			/*
			 * fixme: setup elsewhere (does not belong here): chip->PRAMDAC[0x00000404/4] |= (1 << 25);//0x00680404 = ???
			 */

			/* setup acc engine tile stuff: */
			/* reset tile adresses */
			setACC(NVACC_NV10_FBTIL0AD, 0);
			setACC(NVACC_NV10_FBTIL1AD, 0);
			setACC(NVACC_NV10_FBTIL2AD, 0);
			setACC(NVACC_NV10_FBTIL3AD, 0);
			setACC(NVACC_NV10_FBTIL4AD, 0);
			setACC(NVACC_NV10_FBTIL5AD, 0);
			setACC(NVACC_NV10_FBTIL6AD, 0);
			setACC(NVACC_NV10_FBTIL7AD, 0);
			/* copy tile setup stuff from 'source' to acc engine */
			if (architecture >= NV20A) {
				/* unknown: */
				setACC(NVACC_NV20_WHAT0, getACC(NVACC_NV20_FBWHAT0));
				setACC(NVACC_NV20_WHAT1, getACC(NVACC_NV20_FBWHAT1));
			}
			/* tile 0: */
			/* tile invalid, tile adress = $00000 (18bit) */
			setACC(NVACC_NV10_TIL0AD, getACC(NVACC_NV10_FBTIL0AD));
			/* set tile end adress (18bit) */
			setACC(NVACC_NV10_TIL0ED, getACC(NVACC_NV10_FBTIL0ED));
			/* set tile size pitch (8bit: b8-15) */
			setACC(NVACC_NV10_TIL0PT, getACC(NVACC_NV10_FBTIL0PT));
			/* set tile status */
			setACC(NVACC_NV10_TIL0ST, getACC(NVACC_NV10_FBTIL0ST));
			/* tile 1: */
			setACC(NVACC_NV10_TIL1AD, getACC(NVACC_NV10_FBTIL1AD));
			setACC(NVACC_NV10_TIL1ED, getACC(NVACC_NV10_FBTIL1ED));
			setACC(NVACC_NV10_TIL1PT, getACC(NVACC_NV10_FBTIL1PT));
			setACC(NVACC_NV10_TIL1ST, getACC(NVACC_NV10_FBTIL1ST));
			/* tile 2: */
			setACC(NVACC_NV10_TIL2AD, getACC(NVACC_NV10_FBTIL2AD));
			setACC(NVACC_NV10_TIL2ED, getACC(NVACC_NV10_FBTIL2ED));
			setACC(NVACC_NV10_TIL2PT, getACC(NVACC_NV10_FBTIL2PT));
			setACC(NVACC_NV10_TIL2ST, getACC(NVACC_NV10_FBTIL2ST));
			/* tile 3: */
			setACC(NVACC_NV10_TIL3AD, getACC(NVACC_NV10_FBTIL3AD));
			setACC(NVACC_NV10_TIL3ED, getACC(NVACC_NV10_FBTIL3ED));
			setACC(NVACC_NV10_TIL3PT, getACC(NVACC_NV10_FBTIL3PT));
			setACC(NVACC_NV10_TIL3ST, getACC(NVACC_NV10_FBTIL3ST));
			/* tile 4: */
			setACC(NVACC_NV10_TIL4AD, getACC(NVACC_NV10_FBTIL4AD));
			setACC(NVACC_NV10_TIL4ED, getACC(NVACC_NV10_FBTIL4ED));
			setACC(NVACC_NV10_TIL4PT, getACC(NVACC_NV10_FBTIL4PT));
			setACC(NVACC_NV10_TIL4ST, getACC(NVACC_NV10_FBTIL4ST));
			/* tile 5: */
			setACC(NVACC_NV10_TIL5AD, getACC(NVACC_NV10_FBTIL5AD));
			setACC(NVACC_NV10_TIL5ED, getACC(NVACC_NV10_FBTIL5ED));
			setACC(NVACC_NV10_TIL5PT, getACC(NVACC_NV10_FBTIL5PT));
			setACC(NVACC_NV10_TIL5ST, getACC(NVACC_NV10_FBTIL5ST));
			/* tile 6: */
			setACC(NVACC_NV10_TIL6AD, getACC(NVACC_NV10_FBTIL6AD));
			setACC(NVACC_NV10_TIL6ED, getACC(NVACC_NV10_FBTIL6ED));
			setACC(NVACC_NV10_TIL6PT, getACC(NVACC_NV10_FBTIL6PT));
			setACC(NVACC_NV10_TIL6ST, getACC(NVACC_NV10_FBTIL6ST));
			/* tile 7: */
			setACC(NVACC_NV10_TIL7AD, getACC(NVACC_NV10_FBTIL7AD));
			setACC(NVACC_NV10_TIL7ED, getACC(NVACC_NV10_FBTIL7ED));
			setACC(NVACC_NV10_TIL7PT, getACC(NVACC_NV10_FBTIL7PT));
			setACC(NVACC_NV10_TIL7ST, getACC(NVACC_NV10_FBTIL7ST));

			/* setup pipe */
			/* set eyetype to local, lightning is off */
			setACC(NVACC_NV10_XFMOD0, 0x10000000);
			/* disable all lights */
			setACC(NVACC_NV10_XFMOD1, 0x00000000);

			setACC(NVACC_NV10_PIPEADR, 0x00000040);
			setACC(NVACC_NV10_PIPEDAT, 0x00000008);

			setACC(NVACC_NV10_PIPEADR, 0x00000200);
			for (int cnt = 0; cnt < (3 * 16); cnt++)
				setACC(NVACC_NV10_PIPEDAT, 0x00000000);

			setACC(NVACC_NV10_PIPEADR, 0x00000040);
			setACC(NVACC_NV10_PIPEDAT, 0x00000000);

			setACC(NVACC_NV10_PIPEADR, 0x00000800);
			for (int cnt = 0; cnt < (16 * 16); cnt++)
				setACC(NVACC_NV10_PIPEDAT, 0x00000000);

			/* turn lightning on */
			setACC(NVACC_NV10_XFMOD0, 0x30000000);
			/* set light 1 to infinite type, other lights remain off */
			setACC(NVACC_NV10_XFMOD1, 0x00000004);

			setACC(NVACC_NV10_PIPEADR, 0x00006400);
			for (int cnt = 0; cnt < (59 * 4); cnt++)
				setACC(NVACC_NV10_PIPEDAT, 0x00000000);

			setACC(NVACC_NV10_PIPEADR, 0x00006800);
			for (int cnt = 0; cnt < (47 * 4); cnt++)
				setACC(NVACC_NV10_PIPEDAT, 0x00000000);

			setACC(NVACC_NV10_PIPEADR, 0x00006c00);
			for (int cnt = 0; cnt < (3 * 4); cnt++)
				setACC(NVACC_NV10_PIPEDAT, 0x00000000);

			setACC(NVACC_NV10_PIPEADR, 0x00007000);
			for (int cnt = 0; cnt < (19 * 4); cnt++)
				setACC(NVACC_NV10_PIPEDAT, 0x00000000);

			setACC(NVACC_NV10_PIPEADR, 0x00007400);
			for (int cnt = 0; cnt < (12 * 4); cnt++)
				setACC(NVACC_NV10_PIPEDAT, 0x00000000);

			setACC(NVACC_NV10_PIPEADR, 0x00007800);
			for (int cnt = 0; cnt < (12 * 4); cnt++)
				setACC(NVACC_NV10_PIPEDAT, 0x00000000);

			setACC(NVACC_NV10_PIPEADR, 0x00004400);
			for (int cnt = 0; cnt < (8 * 4); cnt++)
				setACC(NVACC_NV10_PIPEDAT, 0x00000000);

			setACC(NVACC_NV10_PIPEADR, 0x00000000);
			for (int cnt = 0; cnt < 16; cnt++)
				setACC(NVACC_NV10_PIPEDAT, 0x00000000);

			setACC(NVACC_NV10_PIPEADR, 0x00000040);
			for (int cnt = 0; cnt < 4; cnt++)
				setACC(NVACC_NV10_PIPEDAT, 0x00000000);
		}

		/** * setup acceleration engine command shortcuts (so via fifo) ** */
		/* (b31 = 1 selects 'config' function?) */
		setACC(NVACC_FIFO_00800000, 0x80000000); /* Raster OPeration */
		setACC(NVACC_FIFO_00802000, 0x80000001); /* Clip */
		setACC(NVACC_FIFO_00804000, 0x80000002); /* Pattern */
		setACC(NVACC_FIFO_00806000, 0x80000010); /* Pixmap (not used) */
		setACC(NVACC_FIFO_00808000, 0x80000011); /* Blit */
		setACC(NVACC_FIFO_0080a000, 0x80000012); /* Bitmap */
		setACC(NVACC_FIFO_0080c000, 0x80000016); /* Line (not used) */
		setACC(NVACC_FIFO_0080e000, 0x80000014); /* ??? (not used) */

		/*
		 * do first actual acceleration engine command: setup clipping region (workspace size) to 32768 x 32768 pixels: wait for room in fifo for clipping cmd if needed. (fifo holds 256 32bit words:
		 * count those, not bytes)
		 */
		while (((io.getReg16(NV16_CLP_FIFOFREE)) >> 2) < 2) {
			try {
				/* snooze a bit so I do not hammer the bus */
				Thread.sleep(10);
			} catch (InterruptedException ex) {
				// Ignore
			}
		}
		/* now setup clipping (writing 2 32bit words) */
		setACC(NVACC_CLP_TOPLEFT, 0x00000000);
		setACC(NVACC_CLP_WIDHEIGHT, 0x80008000);
	}

	/**
	 * Wait until engine completely idle.
	 */
	/*
	 * private final void waitUntilIdle() { while (getACC(NVACC_STATUS) != 0) { snooze(25); }
	 */

	/**
	 * Read from the acceleration engine registers.
	 * 
	 * @param reg
	 * @return int
	 */
	private final int getACC(int reg) {
		return io.getReg32(reg);
	}

	/**
	 * Write to the acceleration engine registers.
	 * 
	 * @param reg
	 */
	private final void setACC(int reg, int value) {
		io.setReg32(reg, value);
	}

	private final void snooze(long ms) {
		try {
			Thread.sleep(ms);
		} catch (InterruptedException ex) {
			// Ignore
		}
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?