void gs_swap_chain::Init(gs_init_data *data)
{
	target.device         = device;
	target.isRenderTarget = true;
	target.format         = data->format;
	target.dxgiFormat     = ConvertGSTextureFormat(data->format);
	InitTarget(data->cx, data->cy);

	zs.device     = device;
	zs.format     = data->zsformat;
	zs.dxgiFormat = ConvertGSZStencilFormat(data->zsformat);
	InitZStencilBuffer(data->cx, data->cy);
}
void gs_swap_chain::Resize(uint32_t cx, uint32_t cy)
{
	RECT clientRect;
	HRESULT hr;

	target.texture.Clear();
	target.renderTarget[0].Clear();
	zs.texture.Clear();
	zs.view.Clear();

	if (cx == 0 || cy == 0) {
		GetClientRect(hwnd, &clientRect);
		if (cx == 0) cx = clientRect.right;
		if (cy == 0) cy = clientRect.bottom;
	}

	hr = swap->ResizeBuffers(numBuffers, cx, cy, target.dxgiFormat, 0);
	if (FAILED(hr))
		throw HRError("Failed to resize swap buffers", hr);

	InitTarget(cx, cy);
	InitZStencilBuffer(cx, cy);
}
示例#3
0
/**
Handle incomming frames from the serial port.
*/
void rxhandler(void) {
    switch (serRxBuf.header.type) {
        case ACK:
        case NACK:
            break;

        case T_CONNECT:                         //connect JTAG to the target
            InitTarget();
            if (GetDevice() == STATUS_OK) {
                txACK();
                //printf("Device type: %04x\n", DEVICE);
            } else{
                txNACKstr("no target");
            }
            break;
        case T_RELEASE:                         //release JTAG from target
            ClrTCLK();
            IR_Shift(IR_CNTRL_SIG_16BIT);
            DR_Shift16(0x3001);         //lch
            IR_Shift(IR_CNTRL_SIG_RELEASE);
            SetTCLK();
            ReleaseTarget();
            txACK();
            break;
        case T_RESET:                           //reset the target and release JTAG
            ReleaseDevice(V_RESET);
            ReleaseTarget();
            txACK();
            break;
        case T_PUC:                             //reset the target through JTAG, keep connection
            ExecutePUC();
            txACK();
            break;

        case T_MEMREAD:                         //ream memory from target
            {                                   //use a new block for local vars
                word size = serRxBuf.data.memread.size;
                word address = serRxBuf.data.memread.address;
                word offset;
    
                txACK();
                HaltCPU();
                if (size > sizeof(serTxBuf.data.memdata.data)) {
                   size = sizeof(serTxBuf.data.memdata.data);
                }
                if (address <= 0xff) {          //peripherals in bytemode
                    for (offset = 0; offset < size; offset++) {
                        serTxBuf.data.memdata.data[offset] = ReadMem(F_BYTE, address+offset);
                    }
                } else {                        //peripherals in wordmode as well as RAM and Flash
                    address = address & 0xfffe; //startaddress has to be even!
                    for (offset = 0; offset < size/2; offset++) {
                        ((word *)serTxBuf.data.memdata.data)[offset] = ReadMem(F_WORD, address+offset*2);
                    }
                    if (size & 1) {
                        //odd size, read last byte separate
                        //odd sizes on word-mode peripherals yield  wrong results
                        //in the last word!!
                        serTxBuf.data.memdata.data[size-1] = ReadMem(F_BYTE, address+size-1);
                    }
                }
                serTxBuf.data.memdata.address = address;
                serTxBuf.header.type = T_MEMDATA;
                serTxBuf.header.size = 2+size;
                sendMessage(&serTxBuf);
            }
            break;
        case T_MEMWRITE:                        //write target memory (Peripherals, RAM, Flash)
            {
                word offset;
                word size = serRxBuf.header.size - 2;
                HaltCPU();
                if ((serRxBuf.data.memwrite.address >= 0x100) &&
                    (serRxBuf.data.memwrite.address <= 0x1ff)) { //peripherals in wordmode
                    for (offset = 0; offset < size; offset+=2) {
                        WriteMem(F_WORD,
                                 serRxBuf.data.memwrite.address+offset,
                                 ((word*)serRxBuf.data.memwrite.data)[offset/2]
                        );
                    }
                } else if (serRxBuf.data.memwrite.address < 0x1000) {  //ram + peripherals, bytemode
                    for (offset = 0; offset < size; offset++) {
                        WriteMem(F_BYTE,
                                 serRxBuf.data.memwrite.address+offset,
                                 serRxBuf.data.memwrite.data[offset]
                        );
                    }
                } else {                        //flash memory, wordmode
                    WriteFLASH(serRxBuf.data.memwrite.address,
                               size/2,
                               (word *)serRxBuf.data.memwrite.data
                    );
                }
                txACK();
            }
            break;
        case T_EXEC:                            //execute target program located at given address
            ReleaseDevice(serRxBuf.data.exec.address);
            txACK();
            break;
        case T_MEMERASE:                        //erase target flash (Segment, Main or All)
            HaltCPU();
            EraseFLASH(
                serRxBuf.data.memerase.mode,
                serRxBuf.data.memerase.address
            );
            txACK();
            break;
        case T_MCLK:                            //provide MCLKs, allows sort of single stepping
            ClrTCLK();
            IR_Shift(IR_CNTRL_SIG_16BIT);
            DR_Shift16(0x3401);         //lch
            while (serRxBuf.data.step.numsteps--) {
                SetTCLK();
                ClrTCLK();
            }
            SetTCLK();
            txACK();
            break;

        case MEMREAD:                           //host memory read
            {
                word size = serRxBuf.data.memread.size;
                byte *address = (byte*)serRxBuf.data.memread.address;
                word offset;
                txACK();
                if (size > sizeof(serTxBuf.data.memdata.data)) {
                   size = sizeof(serTxBuf.data.memdata.data);
                }
                if (address <= (byte *)0xff) {      //bytemode
                    for (offset = 0; offset < size; offset++) {
                        serTxBuf.data.memdata.data[offset] = address[offset];
                    }
                } else {                            //wordmode
                    address = (byte *)((word)address & 0xfffe);    //startaddress has to be even!
                    size &= 0xfffe;                     //size has to be even
                    for (offset = 0; offset < size/2; offset++) {
                        ((word *)serTxBuf.data.memdata.data)[offset] = ((word *)address)[offset];
                    }
                }
                serTxBuf.data.memdata.address = (word)address;
                serTxBuf.header.type = MEMDATA;
                serTxBuf.header.size = 2+size;
                sendMessage(&serTxBuf);
            }
            break;
        case MEMWRITE:                          //host memory write, used to download user programs
            {
                void *adr = (byte *)serRxBuf.data.memwrite.address;
                word offset;
                word size = serRxBuf.header.size - 2;
                if ((adr >= (void *)0x100) && (adr <= (void *)0x1ff)) { //peripherals, wordmode
                    for (offset = 0; offset < size/2; offset++) {
                        ((word *)adr)[offset] = ((word *)serRxBuf.data.memwrite.data)[offset];
                    }
                    txACK();
                    return;
                }
                if (adr < (void *)0x1000) {     //ram + peripherals, bytemode
                    for (offset = 0; offset < size; offset++) {
                        ((byte *)adr)[offset] = serRxBuf.data.memwrite.data[offset];
                    }
                } else {                        //flash
                    flashWriteBlock(
                        serRxBuf.data.memwrite.data,
                        (void *)serRxBuf.data.memwrite.address,
                        size);
                }
                txACK();
            }
            break;
        case MEMERASE:                          //erase one segemnt on host
            flashErase((void *)serRxBuf.data.memerase.address);
            txACK();
            break;
        //~ case MEMEXEC:                       //exec code on host
                //~ serRxBuf.memexec.function(
                    //~ serRxBuf.memexec.arg1,
                    //~ serRxBuf.memexec.arg2
                //~ );
            //~ txACK();
            //~ break;
        case STARTBSL:                          //start BSL for firmware upgrade
            txACK();
            while((UTCTL0 & TXEPT) == 0) {}     //wait until last byte is sent
            FCTL3 = 0;                          //generate a flash key violation -> POR reset, see main()
            break;
        default:
            txNACKstr("unknown command");       //serialComm error: unknown command
    }
}