/** * taskfile_load_raw - send taskfile registers to drive * @drive: drive to which output is sent * @gtf: raw ATA taskfile register set (0x1f1 - 0x1f7) * * Outputs IDE taskfile to the drive. */ static int taskfile_load_raw(ide_drive_t *drive, const struct taskfile_array *gtf) { ide_task_t args; int err = 0; DEBPRINT("(0x1f1-1f7): hex: " "%02x %02x %02x %02x %02x %02x %02x\n", gtf->tfa[0], gtf->tfa[1], gtf->tfa[2], gtf->tfa[3], gtf->tfa[4], gtf->tfa[5], gtf->tfa[6]); memset(&args, 0, sizeof(ide_task_t)); /* convert gtf to IDE Taskfile */ memcpy(&args.tf_array[7], >f->tfa, 7); args.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE; if (ide_noacpitfs) { DEBPRINT("_GTF execution disabled\n"); return err; } err = ide_no_data_taskfile(drive, &args); if (err) printk(KERN_ERR "%s: ide_no_data_taskfile failed: %u\n", __FUNCTION__, err); return err; }
/** * ide_acpi_set_state - set the channel power state * @hwif: target IDE interface * @on: state, on/off * * This function executes the _PS0/_PS3 ACPI method to set the power state. * ACPI spec requires _PS0 when IDE power on and _PS3 when power off */ void ide_acpi_set_state(ide_hwif_t *hwif, int on) { int unit; if (ide_noacpi || ide_noacpi_psx) return; DEBPRINT("ENTER:\n"); if (!hwif->acpidata) { DEBPRINT("no ACPI data for %s\n", hwif->name); return; } /* channel first and then drives for power on and verse versa for power off */ if (on) acpi_bus_set_power(hwif->acpidata->obj_handle, ACPI_STATE_D0); for (unit = 0; unit < MAX_DRIVES; ++unit) { ide_drive_t *drive = &hwif->drives[unit]; if (!drive->acpidata->obj_handle) drive->acpidata->obj_handle = ide_acpi_drive_get_handle(drive); if (drive->acpidata->obj_handle && drive->present) { acpi_bus_set_power(drive->acpidata->obj_handle, on? ACPI_STATE_D0: ACPI_STATE_D3); } } if (!on) acpi_bus_set_power(hwif->acpidata->obj_handle, ACPI_STATE_D3); }
/** * ide_acpi_exec_tfs - get then write drive taskfile settings * @drive: the drive for which the taskfile settings should be * written. * * According to the ACPI spec this should be called after _STM * has been evaluated for the interface. Some ACPI vendors interpret * that as a hard requirement and modify the taskfile according * to the Identify Drive information passed down with _STM. * So one should really make sure to call this only after _STM has * been executed. */ int ide_acpi_exec_tfs(ide_drive_t *drive) { int ret; unsigned int gtf_length; unsigned long gtf_address; unsigned long obj_loc; if (ide_noacpi) return 0; DEBPRINT("call get_GTF, drive=%s port=%d\n", drive->name, drive->dn); ret = do_drive_get_GTF(drive, >f_length, >f_address, &obj_loc); if (ret < 0) { DEBPRINT("get_GTF error (%d)\n", ret); return ret; } DEBPRINT("call set_taskfiles, drive=%s\n", drive->name); ret = do_drive_set_taskfiles(drive, gtf_length, gtf_address); kfree((void *)obj_loc); if (ret < 0) { DEBPRINT("set_taskfiles error (%d)\n", ret); } DEBPRINT("ret=%d\n", ret); return ret; }
/** * ide_acpi_hwif_get_handle - Get ACPI object handle for a given hwif * @hwif: device to locate * * Retrieves the object handle for a given hwif. * * Returns handle on success, 0 on error. */ static acpi_handle ide_acpi_hwif_get_handle(ide_hwif_t *hwif) { struct device *dev = hwif->gendev.parent; acpi_handle uninitialized_var(dev_handle); acpi_integer pcidevfn; acpi_handle chan_handle; int err; DEBPRINT("ENTER: device %s\n", hwif->name); if (!dev) { DEBPRINT("no PCI device for %s\n", hwif->name); return NULL; } err = ide_get_dev_handle(dev, &dev_handle, &pcidevfn); if (err < 0) { DEBPRINT("ide_get_dev_handle failed (%d)\n", err); return NULL; } /* get child objects of dev_handle == channel objects, * + _their_ children == drive objects */ /* channel is hwif->channel */ chan_handle = acpi_get_child(dev_handle, hwif->channel); DEBPRINT("chan adr=%d: handle=0x%p\n", hwif->channel, chan_handle); return chan_handle; }
static inline VOID ResetAero(VOID) { if (pfnDwmEnableComposition && AeroWasEnabled) { if (SUCCEEDED(pfnDwmEnableComposition(AeroWasEnabled))) DEBPRINT("Aero rendering setting restored\n"); else DEBPRINT("We failed to restore Aero rendering\n"); } UnloadDM(); }
/** * ide_get_dev_handle - finds acpi_handle and PCI device.function * @dev: device to locate * @handle: returned acpi_handle for @dev * @pcidevfn: return PCI device.func for @dev * * Returns the ACPI object handle to the corresponding PCI device. * * Returns 0 on success, <0 on error. */ static int ide_get_dev_handle(struct device *dev, acpi_handle *handle, acpi_integer *pcidevfn) { struct pci_dev *pdev = to_pci_dev(dev); unsigned int bus, devnum, func; acpi_integer addr; acpi_handle dev_handle; struct acpi_buffer buffer = {.length = ACPI_ALLOCATE_BUFFER, .pointer = NULL}; acpi_status status; struct acpi_device_info *dinfo = NULL; int ret = -ENODEV; bus = pdev->bus->number; devnum = PCI_SLOT(pdev->devfn); func = PCI_FUNC(pdev->devfn); /* ACPI _ADR encoding for PCI bus: */ addr = (acpi_integer)(devnum << 16 | func); DEBPRINT("ENTER: pci %02x:%02x.%01x\n", bus, devnum, func); dev_handle = DEVICE_ACPI_HANDLE(dev); if (!dev_handle) { DEBPRINT("no acpi handle for device\n"); goto err; } status = acpi_get_object_info(dev_handle, &buffer); if (ACPI_FAILURE(status)) { DEBPRINT("get_object_info for device failed\n"); goto err; } dinfo = buffer.pointer; if (dinfo && (dinfo->valid & ACPI_VALID_ADR) && dinfo->address == addr) { *pcidevfn = addr; *handle = dev_handle; } else { DEBPRINT("get_object_info for device has wrong " " address: %llu, should be %u\n", dinfo ? (unsigned long long)dinfo->address : -1ULL, (unsigned int)addr); goto err; } DEBPRINT("for dev=0x%x.%x, addr=0x%llx, *handle=0x%p\n", devnum, func, (unsigned long long)addr, *handle); ret = 0; err: kfree(dinfo); return ret; }
void ide_acpi_port_init_devices(ide_hwif_t *hwif) { ide_drive_t *drive; int i, err; if (hwif->acpidata == NULL) return; /* * The ACPI spec mandates that we send information * for both drives, regardless whether they are connected * or not. */ hwif->drives[0].acpidata = &hwif->acpidata->master; hwif->drives[1].acpidata = &hwif->acpidata->slave; /* * Send IDENTIFY for each drive */ for (i = 0; i < MAX_DRIVES; i++) { drive = &hwif->drives[i]; if (!drive->present) continue; err = taskfile_lib_get_identify(drive, drive->acpidata->idbuff); if (err) DEBPRINT("identify device %s failed (%d)\n", drive->name, err); } if (ide_noacpionboot) { DEBPRINT("ACPI methods disabled on boot\n"); return; } /* ACPI _PS0 before _STM */ ide_acpi_set_state(hwif, 1); /* * ACPI requires us to call _STM on startup */ ide_acpi_get_timing(hwif); ide_acpi_push_timing(hwif); for (i = 0; i < MAX_DRIVES; i++) { drive = &hwif->drives[i]; if (drive->present) /* Execute ACPI startup code */ ide_acpi_exec_tfs(drive); } }
// search for T-intersection problem // BP : It can be mush more faster doing this at the same time of the splitpoly // but we must use a different structure : polygone pointing on segs // segs pointing on polygone and on vertex (too mush complicated, well not // realy but i am soo lasy), the methode discibed is also better for segs presition static INT32 SolveTProblem(void) { poly_t *p; INT32 i; size_t l; if (cv_grsolvetjoin.value == 0) return 0; DEBPRINT("Solving T-joins. This may take a while. Please wait...\n"); CON_Drawer(); //let the user know what we are doing I_FinishUpdate(); // page flip or blit buffer numsplitpoly = 0; for (l = 0; l < addsubsector; l++) { p = extrasubsectors[l].planepoly; if (p) for (i = 0; i < p->numpts; i++) SearchSegInBSP((INT32)numnodes-1, &p->pts[i], p); } //DEBPRINT("numsplitpoly %d\n", numsplitpoly); return numsplitpoly; }
// ======================================================================== // Set video mode routine for DirectDraw display modes // Out: 1 ok, // 0 hardware could not set mode, // -1 no mem // ======================================================================== static INT32 WINAPI VID_SetDirectDrawMode(viddef_t *lvid, vmode_t *currentmode) { UNREFERENCED_PARAMETER(currentmode); DEBPRINT("VID_SetDirectDrawMode...\n"); // DD modes do double-buffer page flipping, but the game engine doesn't need this.. lvid->u.numpages = 2; // release ddraw surfaces etc.. ReleaseChtuff(); // clean up any old vid buffer lying around, alloc new if needed if (!VID_FreeAndAllocVidbuffer(lvid)) return -1; // no mem // should clear video mem here // note use lvid->bpp instead of 8...will this be needed? will we support other than 256color // in software ? if (!InitDirectDrawe(hWndMain, lvid->width, lvid->height, 8, TRUE)) // TRUE currently always full screen return 0; // could not set mode // this is NOT used with DirectDraw modes, game engine should never use this directly // but rather render to memory bitmap buffer lvid->direct = NULL; if (!cv_stretch.value && (float)vid.width/vid.height != ((float)BASEVIDWIDTH/BASEVIDHEIGHT)) vid.height = (int)(vid.width * ((float)BASEVIDHEIGHT/BASEVIDWIDTH));// Adjust the height to match return 1; }
// -------------------------- // VID_SetWindowedDisplayMode // Display the startup 320x200 console screen into a window on the desktop, // switching to fullscreen display only when we will enter the main game loop. // - we can display error message boxes for startup errors // - we can set the last used resolution only once, when entering the main game loop // -------------------------- static INT32 WINAPI VID_SetWindowedDisplayMode(viddef_t *lvid, vmode_t *currentmode) { RECT bounds; int x = 0, y = 0, w = 0, h = 0; UNREFERENCED_PARAMETER(currentmode); DEBPRINT("VID_SetWindowedDisplayMode()\n"); lvid->u.numpages = 1; // not used lvid->direct = NULL; // DOS remains lvid->buffer = NULL; // allocate screens if (!VID_FreeAndAllocVidbuffer(lvid)) return -1; // lvid->buffer should be NULL here! bmiMain = GlobalAlloc(GPTR, sizeof (BITMAPINFO) + (sizeof (RGBQUAD)*256)); if (!bmiMain) I_Error("VID_SWDM(): No mem"); // setup a BITMAPINFO to allow copying our video buffer to the desktop, // with color conversion as needed bmiMain->bmiHeader.biSize = sizeof (BITMAPINFOHEADER); bmiMain->bmiHeader.biWidth = lvid->width; bmiMain->bmiHeader.biHeight= -(lvid->height); bmiMain->bmiHeader.biPlanes = 1; bmiMain->bmiHeader.biBitCount = 8; bmiMain->bmiHeader.biCompression = BI_RGB; // center window on the desktop bounds.left = 0; bounds.right = lvid->width; bounds.top = 0; bounds.bottom = lvid->height; AdjustWindowRectEx(&bounds, GetWindowLong(hWndMain, GWL_STYLE), FALSE, GetWindowLong(hWndMain, GWL_EXSTYLE)); w = bounds.right-bounds.left; h = bounds.bottom-bounds.top; x = (GetSystemMetrics(SM_CXSCREEN)-w)/2; y = (GetSystemMetrics(SM_CYSCREEN)-h)/2; if (devparm) MoveWindow(hWndMain, x<<1, y<<1, w, h, TRUE); else MoveWindow(hWndMain, x, y, w, h, TRUE); SetFocus(hWndMain); ShowWindow(hWndMain, SW_SHOW); hDCMain = GetDC(hWndMain); if (!hDCMain) I_Error("VID_SWDM(): GetDC FAILED"); return 1; }
/** * do_drive_set_taskfiles - write the drive taskfile settings from _GTF * @drive: the drive to which the taskfile command should be sent * @gtf_length: total number of bytes of _GTF taskfiles * @gtf_address: location of _GTF taskfile arrays * * Write {gtf_address, length gtf_length} in groups of * REGS_PER_GTF bytes. */ static int do_drive_set_taskfiles(ide_drive_t *drive, unsigned int gtf_length, unsigned long gtf_address) { int rc = -ENODEV, err; int gtf_count = gtf_length / REGS_PER_GTF; int ix; struct taskfile_array *gtf; if (ide_noacpi) return 0; DEBPRINT("ENTER: %s, hard_port#: %d\n", drive->name, drive->dn); if (!drive->present) goto out; if (!gtf_count) /* shouldn't be here */ goto out; DEBPRINT("total GTF bytes=%u (0x%x), gtf_count=%d, addr=0x%lx\n", gtf_length, gtf_length, gtf_count, gtf_address); if (gtf_length % REGS_PER_GTF) { printk(KERN_ERR "%s: unexpected GTF length (%d)\n", __FUNCTION__, gtf_length); goto out; } rc = 0; for (ix = 0; ix < gtf_count; ix++) { gtf = (struct taskfile_array *) (gtf_address + ix * REGS_PER_GTF); /* send all TaskFile registers (0x1f1-0x1f7) *in*that*order* */ err = taskfile_load_raw(drive, gtf); if (err) rc = err; } out: return rc; }
/** * ide_acpi_push_timing - set the channel (controller) timings * @hwif: target IDE interface (channel) * * This function executes the _STM ACPI method for the target channel. * * _STM requires Identify Drive data, which has to passed as an argument. * Unfortunately hd_driveid is a mangled version which we can't readily * use; hence we'll get the information afresh. */ void ide_acpi_push_timing(ide_hwif_t *hwif) { acpi_status status; struct acpi_object_list input; union acpi_object in_params[3]; struct ide_acpi_drive_link *master = &hwif->acpidata->master; struct ide_acpi_drive_link *slave = &hwif->acpidata->slave; if (ide_noacpi) return; DEBPRINT("ENTER:\n"); if (!hwif->acpidata) { DEBPRINT("no ACPI data for %s\n", hwif->name); return; } /* Give the GTM buffer + drive Identify data to the channel via the * _STM method: */ /* setup input parameters buffer for _STM */ input.count = 3; input.pointer = in_params; in_params[0].type = ACPI_TYPE_BUFFER; in_params[0].buffer.length = sizeof(struct GTM_buffer); in_params[0].buffer.pointer = (u8 *)&hwif->acpidata->gtm; in_params[1].type = ACPI_TYPE_BUFFER; in_params[1].buffer.length = sizeof(struct hd_driveid); in_params[1].buffer.pointer = (u8 *)&master->idbuff; in_params[2].type = ACPI_TYPE_BUFFER; in_params[2].buffer.length = sizeof(struct hd_driveid); in_params[2].buffer.pointer = (u8 *)&slave->idbuff; /* Output buffer: _STM has no output */ status = acpi_evaluate_object(hwif->acpidata->obj_handle, "_STM", &input, NULL); if (ACPI_FAILURE(status)) { DEBPRINT("Run _STM error: status = 0x%x\n", status); } DEBPRINT("_STM status: %d\n", status); }
static inline BOOL LoadDM(VOID) { if (DMdll) return TRUE; DMdll = LoadLibraryA("dwmapi.dll"); if (DMdll) DEBPRINT("dmwapi.dll loaded, Vista's Desktop Window Manager API\n"); else return FALSE; pfnDwmIsCompositionEnabled = (P_DwmIsCompositionEnabled)GetProcAddress(DMdll, "DwmIsCompositionEnabled"); if (pfnDwmIsCompositionEnabled) DEBPRINT("Composition Aero API found, DwmIsCompositionEnabled\n"); pfnDwmEnableComposition = (P_DwmEnableComposition)GetProcAddress(DMdll, "DwmEnableComposition"); if (pfnDwmEnableComposition) DEBPRINT("Composition Aero API found, DwmEnableComposition\n"); return TRUE; }
static inline VOID DisableAero(VOID) { BOOL pfnDwmEnableCompositiond = FALSE; AeroWasEnabled = FALSE; if (!LoadDM()) return; if (pfnDwmIsCompositionEnabled && SUCCEEDED(pfnDwmIsCompositionEnabled(&pfnDwmEnableCompositiond))) DEBPRINT("Got the result of DwmIsCompositionEnabled, %i\n", pfnDwmEnableCompositiond); else return; if ((AeroWasEnabled = pfnDwmEnableCompositiond)) DEBPRINT("Disable the Aero rendering\n"); else return; if (pfnDwmEnableComposition && SUCCEEDED(pfnDwmEnableComposition(FALSE))) DEBPRINT("Aero rendering disabled\n"); else DEBPRINT("We failed to disable the Aero rendering\n"); }
boolean LoadGL(void) { #ifndef STATIC_OPENGL const char *OGLLibname = NULL; const char *GLULibname = NULL; if (M_CheckParm ("-OGLlib") && M_IsNextParm()) OGLLibname = M_GetNextParm(); if (SDL_GL_LoadLibrary(OGLLibname) != 0) { DEBPRINT(va("Could not load OpenGL Library: %s\n" "Falling back to Software mode.\n", SDL_GetError())); if (!M_CheckParm ("-OGLlib")) DEBPRINT("If you know what is the OpenGL library's name, use -OGLlib\n"); return 0; } #if 0 GLULibname = "/proc/self/exe"; #elif defined (_WIN32) GLULibname = "GLU32.DLL"; #elif defined (__MACH__) GLULibname = "/System/Library/Frameworks/OpenGL.framework/Libraries/libGLU.dylib"; #elif defined (macintos) GLULibname = "OpenGLLibrary"; #elif defined (__unix__) GLULibname = "libGLU.so.1"; #elif defined (__HAIKU__) GLULibname = "libGLU.so"; #else GLULibname = NULL; #endif if (M_CheckParm ("-GLUlib") && M_IsNextParm()) GLULibname = M_GetNextParm(); if (GLULibname) { GLUhandle = hwOpen(GLULibname); if (GLUhandle) return SetupGLfunc(); else { DEBPRINT(va("Could not load GLU Library: %s\n", GLULibname)); if (!M_CheckParm ("-GLUlib")) DEBPRINT("If you know what is the GLU library's name, use -GLUlib\n"); } } else { DEBPRINT("Could not load GLU Library\n"); DEBPRINT("If you know what is the GLU library's name, use -GLUlib\n"); } #endif return SetupGLfunc(); }
/** * ide_acpi_init - initialize the ACPI link for an IDE interface * @hwif: target IDE interface (channel) * * The ACPI spec is not quite clear when the drive identify buffer * should be obtained. Calling IDENTIFY DEVICE during shutdown * is not the best of ideas as the drive might already being put to * sleep. And obviously we can't call it during resume. * So we get the information during startup; but this means that * any changes during run-time will be lost after resume. */ void ide_acpi_init(ide_hwif_t *hwif) { ide_acpi_blacklist(); hwif->acpidata = kzalloc(sizeof(struct ide_acpi_hwif_link), GFP_KERNEL); if (!hwif->acpidata) return; hwif->acpidata->obj_handle = ide_acpi_hwif_get_handle(hwif); if (!hwif->acpidata->obj_handle) { DEBPRINT("no ACPI object for %s found\n", hwif->name); kfree(hwif->acpidata); hwif->acpidata = NULL; } }
/** * ide_acpi_drive_get_handle - Get ACPI object handle for a given drive * @drive: device to locate * * Retrieves the object handle of a given drive. According to the ACPI * spec the drive is a child of the hwif. * * Returns handle on success, 0 on error. */ static acpi_handle ide_acpi_drive_get_handle(ide_drive_t *drive) { ide_hwif_t *hwif = HWIF(drive); int port; acpi_handle drive_handle; if (!hwif->acpidata) return NULL; if (!hwif->acpidata->obj_handle) return NULL; port = hwif->channel ? drive->dn - 2: drive->dn; DEBPRINT("ENTER: %s at channel#: %d port#: %d\n", drive->name, hwif->channel, port); /* TBD: could also check ACPI object VALID bits */ drive_handle = acpi_get_child(hwif->acpidata->obj_handle, port); DEBPRINT("drive %s handle 0x%p\n", drive->name, drive_handle); return drive_handle; }
// allocate pool for fast alloc of polys void HWR_InitPolyPool(void) { #ifndef ZPLANALLOC INT32 pnum; //hurdler: quick fix for those who wants to play with larger wad if ((pnum = M_CheckParm("-polypoolsize"))) POLYPOOLSIZE = atoi(myargv[pnum+1])*1024; // (in kb) DEBPRINT("HWR_InitPolyPool(): allocating %d bytes\n", POLYPOOLSIZE); gr_polypool = malloc(POLYPOOLSIZE); if (!gr_polypool) I_Error("HWR_InitPolyPool(): couldn't malloc polypool\n"); HWR_ClearPolys(); #endif }
// ======================================================================== // Free the video buffer of the last video mode, // allocate a new buffer for the video mode to set. // ======================================================================== static BOOL VID_FreeAndAllocVidbuffer(viddef_t *lvid) { const DWORD vidbuffersize = (lvid->width * lvid->height * lvid->bpp * NUMSCREENS); // free allocated buffer for previous video mode if (lvid->buffer) GlobalFree(lvid->buffer); // allocate & clear the new screen buffer lvid->buffer = GlobalAlloc(GPTR, vidbuffersize); if (!lvid->buffer) return FALSE; ZeroMemory(lvid->buffer, vidbuffersize); DEBPRINT(va("VID_FreeAndAllocVidbuffer done, vidbuffersize: %x\n",(UINT32)vidbuffersize)); return TRUE; }
/** * ide_acpi_get_timing - get the channel (controller) timings * @hwif: target IDE interface (channel) * * This function executes the _GTM ACPI method for the target channel. * */ void ide_acpi_get_timing(ide_hwif_t *hwif) { acpi_status status; struct acpi_buffer output; union acpi_object *out_obj; if (ide_noacpi) return; DEBPRINT("ENTER:\n"); if (!hwif->acpidata) { DEBPRINT("no ACPI data for %s\n", hwif->name); return; } /* Setting up output buffer for _GTM */ output.length = ACPI_ALLOCATE_BUFFER; output.pointer = NULL; /* ACPI-CA sets this; save/free it later */ /* _GTM has no input parameters */ status = acpi_evaluate_object(hwif->acpidata->obj_handle, "_GTM", NULL, &output); DEBPRINT("_GTM status: %d, outptr: 0x%p, outlen: 0x%llx\n", status, output.pointer, (unsigned long long)output.length); if (ACPI_FAILURE(status)) { DEBPRINT("Run _GTM error: status = 0x%x\n", status); return; } if (!output.length || !output.pointer) { DEBPRINT("Run _GTM: length or ptr is NULL (0x%llx, 0x%p)\n", (unsigned long long)output.length, output.pointer); kfree(output.pointer); return; } out_obj = output.pointer; if (out_obj->type != ACPI_TYPE_BUFFER) { kfree(output.pointer); DEBPRINT("Run _GTM: error: " "expected object type of ACPI_TYPE_BUFFER, " "got 0x%x\n", out_obj->type); return; } if (!out_obj->buffer.length || !out_obj->buffer.pointer || out_obj->buffer.length != sizeof(struct GTM_buffer)) { kfree(output.pointer); printk(KERN_ERR "%s: unexpected _GTM length (0x%x)[should be 0x%zx] or " "addr (0x%p)\n", __FUNCTION__, out_obj->buffer.length, sizeof(struct GTM_buffer), out_obj->buffer.pointer); return; } memcpy(&hwif->acpidata->gtm, out_obj->buffer.pointer, sizeof(struct GTM_buffer)); DEBPRINT("_GTM info: ptr: 0x%p, len: 0x%x, exp.len: 0x%Zx\n", out_obj->buffer.pointer, out_obj->buffer.length, sizeof(struct GTM_buffer)); DEBPRINT("_GTM fields: 0x%x, 0x%x, 0x%x, 0x%x, 0x%x\n", hwif->acpidata->gtm.PIO_speed0, hwif->acpidata->gtm.DMA_speed0, hwif->acpidata->gtm.PIO_speed1, hwif->acpidata->gtm.DMA_speed1, hwif->acpidata->gtm.GTM_flags); kfree(output.pointer); }
// ************************************************************************************* // VID_Init // Initialize Video modes subsystem // ************************************************************************************* static VOID VID_Init(VOID) { #ifdef _DEBUG vmode_t *pv; int iMode; #endif // if '-win' is specified on the command line, do not add DirectDraw modes bWinParm = M_CheckParm("-win"); COM_AddCommand("vid_nummodes", VID_Command_NumModes_f); COM_AddCommand("vid_modeinfo", VID_Command_ModeInfo_f); COM_AddCommand("vid_modelist", VID_Command_ModeList_f); COM_AddCommand("vid_mode", VID_Command_Mode_f); CV_RegisterVar(&cv_vidwait); CV_RegisterVar(&cv_stretch); CV_RegisterVar(&cv_ontop); // setup the videmodes list, // note that mode 0 must always be VGA mode 0x13 pvidmodes = pcurrentmode = NULL; numvidmodes = 0; //DisableAero(); // store the main window handle in viddef struct SetWindowPos(hWndMain, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE|SWP_NOSENDCHANGING|SWP_NOSIZE|SWP_NOMOVE); vid.WndParent = hWndMain; vid.buffer = NULL; // we startup in windowed mode using DIB bitmap // we will use DirectDraw when switching fullScreen and entering main game loop bDIBMode = TRUE; bAppFullScreen = FALSE; #ifdef HWRENDER // initialize the appropriate display device if (rendermode != render_soft) { const char *drvname = NULL; switch (rendermode) { case render_opengl: drvname = "r_opengl.dll"; break; default: I_Error("Unknown hardware render mode"); } // load the DLL if (drvname && Init3DDriver(drvname)) { int hwdversion = HWD.pfnGetRenderVersion(); if (hwdversion != VERSION) CONS_Printf("%s", M_GetText("WARNING: This r_opengl version is not supported, use it at your own risk.\n")); // perform initialisations HWD.pfnInit(I_Error); // get available display modes for the device HWD.pfnGetModeList(&pvidmodes, &numvidmodes); } else { switch (rendermode) { case render_opengl: I_Error("Error initializing OpenGL"); default: break; } rendermode = render_soft; } } if (rendermode == render_soft) #endif if (!bWinParm) { if (!CreateDirectDrawInstance()) bWinParm = TRUE; else // get available display modes for the device VID_GetExtraModes(); } // the game boots in 320x200 standard VGA, but // we need a highcolor mode to run the game in highcolor if (highcolor && !numvidmodes) I_Error("Cannot run in highcolor - No 15bit highcolor DirectX video mode found."); // add windowed mode at the start of the list, very important! WindowMode_Init(); if (!numvidmodes) I_Error("No display modes available."); #ifdef _DEBUG // DEBUG for (iMode = 0, pv = pvidmodes; pv; pv = pv->pnext, iMode++) DEBPRINT(va("#%02d: %dx%dx%dbpp (desc: '%s')\n", iMode, pv->width, pv->height, pv->bytesperpixel, pv->name)); #endif // set the startup screen in a window VID_SetMode(0); }
// call this routine after the BSP of a Doom wad file is loaded, // and it will generate all the convex polys for the hardware renderer void HWR_CreatePlanePolygons(INT32 bspnum) { poly_t *rootp; polyvertex_t *rootpv; size_t i; fixed_t rootbbox[4]; DEBPRINT("Creating polygons, please wait...\n"); ls_count = ls_percent = 0; // reset the loading status CON_Drawer(); //let the user know what we are doing I_FinishUpdate(); // page flip or blit buffer HWR_ClearPolys(); // find min/max boundaries of map //DEBPRINT("Looking for boundaries of map...\n"); M_ClearBox(rootbbox); for (i = 0;i < numvertexes; i++) M_AddToBox(rootbbox, vertexes[i].x, vertexes[i].y); //DEBPRINT("Generating subsector polygons... %d subsectors\n", numsubsectors); HWR_FreeExtraSubsectors(); // allocate extra data for each subsector present in map totsubsectors = numsubsectors + NEWSUBSECTORS; extrasubsectors = calloc(totsubsectors, sizeof (*extrasubsectors)); if (extrasubsectors == NULL) I_Error("couldn't malloc extrasubsectors totsubsectors %s\n", sizeu1(totsubsectors)); // allocate table for back to front drawing of subsectors /*gr_drawsubsectors = (INT16 *)malloc(sizeof (*gr_drawsubsectors) * totsubsectors); if (!gr_drawsubsectors) I_Error("couldn't malloc gr_drawsubsectors\n");*/ // number of the first new subsector that might be added addsubsector = numsubsectors; // construct the initial convex poly that encloses the full map rootp = HWR_AllocPoly(4); rootpv = rootp->pts; rootpv->x = FIXED_TO_FLOAT(rootbbox[BOXLEFT ]); rootpv->y = FIXED_TO_FLOAT(rootbbox[BOXBOTTOM]); //lr rootpv++; rootpv->x = FIXED_TO_FLOAT(rootbbox[BOXLEFT ]); rootpv->y = FIXED_TO_FLOAT(rootbbox[BOXTOP ]); //ur rootpv++; rootpv->x = FIXED_TO_FLOAT(rootbbox[BOXRIGHT ]); rootpv->y = FIXED_TO_FLOAT(rootbbox[BOXTOP ]); //ul rootpv++; rootpv->x = FIXED_TO_FLOAT(rootbbox[BOXRIGHT ]); rootpv->y = FIXED_TO_FLOAT(rootbbox[BOXBOTTOM]); //ll rootpv++; WalkBSPNode(bspnum, rootp, NULL,rootbbox); i = SolveTProblem(); //DEBPRINT("%d point divides a polygon line\n",i); AdjustSegs(); //debug debug.. //if (nobackpoly) // DEBPRINT("no back polygon %u times\n",nobackpoly); //"(should happen only with the deep water trick)" //if (skipcut) // DEBPRINT("%u cuts were skipped because of only one point\n",skipcut); //DEBPRINT("done: %u total subsector convex polygons\n", totalsubsecpolys); }
/** * do_drive_get_GTF - get the drive bootup default taskfile settings * @drive: the drive for which the taskfile settings should be retrieved * @gtf_length: number of bytes of _GTF data returned at @gtf_address * @gtf_address: buffer containing _GTF taskfile arrays * * The _GTF method has no input parameters. * It returns a variable number of register set values (registers * hex 1F1..1F7, taskfiles). * The <variable number> is not known in advance, so have ACPI-CA * allocate the buffer as needed and return it, then free it later. * * The returned @gtf_length and @gtf_address are only valid if the * function return value is 0. */ static int do_drive_get_GTF(ide_drive_t *drive, unsigned int *gtf_length, unsigned long *gtf_address, unsigned long *obj_loc) { acpi_status status; struct acpi_buffer output; union acpi_object *out_obj; ide_hwif_t *hwif = HWIF(drive); struct device *dev = hwif->gendev.parent; int err = -ENODEV; int port; *gtf_length = 0; *gtf_address = 0UL; *obj_loc = 0UL; if (ide_noacpi) return 0; if (!dev) { DEBPRINT("no PCI device for %s\n", hwif->name); goto out; } if (!hwif->acpidata) { DEBPRINT("no ACPI data for %s\n", hwif->name); goto out; } port = hwif->channel ? drive->dn - 2: drive->dn; DEBPRINT("ENTER: %s at %s, port#: %d, hard_port#: %d\n", hwif->name, dev->bus_id, port, hwif->channel); if (!drive->present) { DEBPRINT("%s drive %d:%d not present\n", hwif->name, hwif->channel, port); goto out; } /* Get this drive's _ADR info. if not already known. */ if (!drive->acpidata->obj_handle) { drive->acpidata->obj_handle = ide_acpi_drive_get_handle(drive); if (!drive->acpidata->obj_handle) { DEBPRINT("No ACPI object found for %s\n", drive->name); goto out; } } /* Setting up output buffer */ output.length = ACPI_ALLOCATE_BUFFER; output.pointer = NULL; /* ACPI-CA sets this; save/free it later */ /* _GTF has no input parameters */ err = -EIO; status = acpi_evaluate_object(drive->acpidata->obj_handle, "_GTF", NULL, &output); if (ACPI_FAILURE(status)) { printk(KERN_DEBUG "%s: Run _GTF error: status = 0x%x\n", __FUNCTION__, status); goto out; } if (!output.length || !output.pointer) { DEBPRINT("Run _GTF: " "length or ptr is NULL (0x%llx, 0x%p)\n", (unsigned long long)output.length, output.pointer); goto out; } out_obj = output.pointer; if (out_obj->type != ACPI_TYPE_BUFFER) { DEBPRINT("Run _GTF: error: " "expected object type of ACPI_TYPE_BUFFER, " "got 0x%x\n", out_obj->type); err = -ENOENT; kfree(output.pointer); goto out; } if (!out_obj->buffer.length || !out_obj->buffer.pointer || out_obj->buffer.length % REGS_PER_GTF) { printk(KERN_ERR "%s: unexpected GTF length (%d) or addr (0x%p)\n", __FUNCTION__, out_obj->buffer.length, out_obj->buffer.pointer); err = -ENOENT; kfree(output.pointer); goto out; } *gtf_length = out_obj->buffer.length; *gtf_address = (unsigned long)out_obj->buffer.pointer; *obj_loc = (unsigned long)out_obj; DEBPRINT("returning gtf_length=%d, gtf_address=0x%lx, obj_loc=0x%lx\n", *gtf_length, *gtf_address, *obj_loc); err = 0; out: return err; }
// ======================================================================== // Sets a video mode // ======================================================================== INT32 VID_SetMode(INT32 modenum) { int vstat; vmode_t *pnewmode; if (dedicated) return 0; DEBPRINT(va("VID_SetMode(%d)\n", modenum)); // if mode 0 (windowed) we must not be fullscreen already, // if other mode, check it is not mode 0 and existing if ((modenum >= NUMSPECIALMODES) || bAppFullScreen) { if (modenum > numvidmodes || modenum < NUMSPECIALMODES) { if (!pcurrentmode) modenum = 0; // revert to the default base vid mode else I_Error("Unknown video mode: %d\n", modenum); } } pnewmode = VID_GetModePtr(modenum); // dont switch to the same display mode if (pnewmode == pcurrentmode) return 1; // initialize the new mode pcurrentmode = pnewmode; // initialize vidbuffer size for setmode vid.width = pcurrentmode->width; vid.height = pcurrentmode->height; vid.rowbytes = pcurrentmode->rowbytes; vid.bpp = pcurrentmode->bytesperpixel; if (modenum) // if not 320x200 windowed mode, it's actually a hack { if (rendermode == render_opengl) { // don't accept depth < 16 for OpenGL mode (too much ugly) if (cv_scr_depth.value < 16) CV_SetValue(&cv_scr_depth, 16); vid.bpp = cv_scr_depth.value/8; vid.u.windowed = (bWinParm || !cv_fullscreen.value); pcurrentmode->bytesperpixel = vid.bpp; pcurrentmode->windowed = vid.u.windowed; } } vstat = (*pcurrentmode->setmode)(&vid, pcurrentmode); if (vstat == -1) I_Error("Not enough mem for VID_SetMode\n"); else if (vstat == -2) I_Error("Couldn't set video mode because it failed the test\n"); else if (vstat == -3) I_Error("Couldn't set video mode because it failed the change?\n"); else if (!vstat) I_Error("Couldn't set video mode %d (%dx%d %d bits)\n", modenum, vid.width, vid.height, (vid.bpp*8));// hardware could not setup mode else CONS_Printf(M_GetText("Mode changed to %d (%s)\n"), modenum, pcurrentmode->name); vid.modenum = modenum; // tell game engine to recalc all tables and realloc buffers based on new values vid.recalc = 1; if (modenum < NUMSPECIALMODES) { // we are in startup windowed mode bAppFullScreen = FALSE; bDIBMode = TRUE; } else { // we switch to fullscreen bAppFullScreen = TRUE; bDIBMode = FALSE; #ifdef HWRENDER if (rendermode != render_soft) { // purge all patch graphics stored in software format //Z_FreeTags (PU_PURGELEVEL, PU_PURGELEVEL+100); HWR_Startup(); } #endif } I_RestartSysMouse(); return 1; }
// // D_SRB2Main // void D_SRB2Main(void) { INT32 p; char srb2[82]; // srb2 title banner char title[82]; INT32 pstartmap = 1; boolean autostart = false; // keep error messages until the final flush(stderr) #if !defined (PC_DOS) && !defined (_WIN32_WCE) && !defined(NOTERMIOS) if (setvbuf(stderr, NULL, _IOFBF, 1000)) DEBPRINT("setvbuf didnt work\n"); #endif #ifdef GETTEXT // initialise locale code M_StartupLocale(); #endif // get parameters from a response file (eg: srb2 @parms.txt) M_FindResponseFile(); // MAINCFG is now taken care of where "OBJCTCFG" is handled G_LoadGameSettings(); // identify the main IWAD file to use IdentifyVersion(); #if !defined (_WIN32_WCE) && !defined(NOTERMIOS) setbuf(stdout, NULL); // non-buffered output #endif #if defined (_WIN32_WCE) //|| defined (_DEBUG) || defined (GP2X) devparm = !M_CheckParm("-nodebug"); #else devparm = M_CheckParm("-debug"); #endif // for dedicated server #if !defined (_WINDOWS) //already check in win_main.c dedicated = M_CheckParm("-dedicated") != 0; #endif strcpy(title, "Sonic Robo Blast 2"); strcpy(srb2, "Sonic Robo Blast 2"); D_MakeTitleString(srb2); #ifdef PC_DOS D_Titlebar(srb2, title); #else CONS_Printf("SRB2"VERSIONSTRING"\n"); #endif #if defined (__OS2__) && !defined (SDL) // set PM window title snprintf(pmData->title, sizeof (pmData->title), "Sonic Robo Blast 2" VERSIONSTRING ": %s", title); pmData->title[sizeof (pmData->title) - 1] = '\0'; #endif if (devparm) CONS_Printf("%s", M_GetText("Development mode ON.\n")); // default savegame strcpy(savegamename, SAVEGAMENAME"%u.ssg"); { const char *userhome = D_Home(); //Alam: path to home if (!userhome) { #if ((defined (__unix__) && !defined (MSDOS)) || defined(__APPLE__) || defined (UNIXCOMMON)) && !defined (__CYGWIN__) && !defined (DC) && !defined (PSP) && !defined(GP2X) I_Error("%s", M_GetText("Please set $HOME to your home directory\n")); #elif defined (_WIN32_WCE) && 0 if (dedicated) snprintf(configfile, sizeof configfile, "/Storage Card/SRB2DEMO/d"CONFIGFILENAME); else snprintf(configfile, sizeof configfile, "/Storage Card/SRB2DEMO/"CONFIGFILENAME); #else if (dedicated) snprintf(configfile, sizeof configfile, "d"CONFIGFILENAME); else snprintf(configfile, sizeof configfile, CONFIGFILENAME); #endif } else { // use user specific config file #ifdef DEFAULTDIR snprintf(srb2home, sizeof srb2home, "%s" PATHSEP DEFAULTDIR, userhome); snprintf(downloaddir, sizeof downloaddir, "%s" PATHSEP "DOWNLOAD", srb2home); if (dedicated) snprintf(configfile, sizeof configfile, "%s" PATHSEP "d"CONFIGFILENAME, srb2home); else snprintf(configfile, sizeof configfile, "%s" PATHSEP CONFIGFILENAME, srb2home); // can't use sprintf since there is %u in savegamename strcatbf(savegamename, srb2home, PATHSEP); I_mkdir(srb2home, 0700); #else snprintf(srb2home, sizeof srb2home, "%s", userhome); snprintf(downloaddir, sizeof downloaddir, "%s", userhome); if (dedicated) snprintf(configfile, sizeof configfile, "%s" PATHSEP "d"CONFIGFILENAME, userhome); else snprintf(configfile, sizeof configfile, "%s" PATHSEP CONFIGFILENAME, userhome); // can't use sprintf since there is %u in savegamename strcatbf(savegamename, userhome, PATHSEP); #endif } configfile[sizeof configfile - 1] = '\0'; #ifdef _arch_dreamcast strcpy(downloaddir, "/ram"); // the dreamcast's TMP #endif } if (M_CheckParm("-password") && M_IsNextParm()) { const char *pw = M_GetNextParm(); strncpy(adminpassword, pw, 8); if (strlen(pw) < 8) { size_t z; for (z = strlen(pw); z < 8; z++) adminpassword[z] = 'a'; } } else { size_t z; srand((unsigned int)time(NULL)); for (z = 0; z < 8; z++) adminpassword[z] = (char)(rand() & 127); } adminpassword[8] = '\0'; // add any files specified on the command line with -file wadfile // to the wad list if (!(M_CheckParm("-connect"))) { if (M_CheckParm("-file")) { // the parms after p are wadfile/lump names, // until end of parms or another - preceded parm while (M_IsNextParm()) { const char *s = M_GetNextParm(); if (s) // Check for NULL? { if (!W_VerifyNMUSlumps(s)) modifiedgame = true; D_AddFile(s); } } } } // get map from parms if (M_CheckParm("-server") || dedicated) netgame = server = true; if (M_CheckParm("-warp") && M_IsNextParm()) { pstartmap = atoi(M_GetNextParm()); if (!M_CheckParm("-server")) modifiedgame = true; autostart = true; savemoddata = false; } CONS_Printf("%s", M_GetText("Z_Init: Init zone memory allocation daemon. \n")); Z_Init(); // adapt tables to SRB2's needs, including extra slots for dehacked file support P_PatchInfoTables(); CONS_Printf("%s", M_GetText("W_Init: Init WADfiles.\n")); //---------------------------------------------------- READY TIME // we need to check for dedicated before initialization of some subsystems CONS_Printf("I_StartupTimer...\n"); I_StartupTimer(); // Make backups of some SOCcable tables. P_BackupTables(); // load wad, including the main wad file if (!W_InitMultipleFiles(startupwadfiles)) #ifdef _DEBUG CONS_Error(M_GetText("A WAD file was not found or not valid\n")); #else I_Error("%s", M_GetText("A WAD file was not found or not valid\n")); #endif D_CleanFile(); // Check MD5s of autoloaded files W_VerifyFileMD5(0, "1f698dd35bcedb04631568a84a97d72b"); // srb2.srb W_VerifyFileMD5(1, "86ae3f9179c64358d1c88060e41bd415"); // zones.dta W_VerifyFileMD5(2, "f699d4702b9b505db621e5ad5af4f352"); // sonic.plr W_VerifyFileMD5(3, "dfbbc38080485c70a84a57bb734ceee9"); // tails.plr W_VerifyFileMD5(4, "1ea958e2aee87b6995226a120ba3eaac"); // knux.plr W_VerifyFileMD5(5, "8f702416c15060cd3c53c71b91116914"); // rings.wpn W_VerifyFileMD5(6, "6b1cf9b41e41a46ac58606dc6e7c9e05"); // drill.dta W_VerifyFileMD5(7, "8d080c050ecf03691562aa7b60156fec"); // soar.dta // don't check music.dta because people like to modify it, and it doesn't matter if they do // ...except it does if they slip maps in there, and that's what W_VerifyNMUSlumps is for. mainwads = 8; // there are 8 wads not to unload /* TODO: incorporate this! CONS_Printf("%s", "===========================================================================\n" " Sonic Robo Blast II!\n" " by Sonic Team Junior\n" " http://www.srb2.org\n" " This is a modified version. Go to our site for the original.\n" "===========================================================================\n"); */ // Check and print which version is executed. CONS_Printf("%s", "===========================================================================\n" " We hope you enjoy this game as\n" " much as we did making it!\n" " ...wait. =P\n" "===========================================================================\n"); cht_Init(); //---------------------------------------------------- READY SCREEN // we need to check for dedicated before initialization of some subsystems CONS_Printf("I_StartupGraphics...\n"); I_StartupGraphics(); //--------------------------------------------------------- CONSOLE // setup loading screen SCR_Startup(); // we need the font of the console CONS_Printf("%s", M_GetText("HU_Init: Setting up heads up display.\n")); HU_Init(); COM_Init(); // libogc has a CON_Init function, we must rename SRB2's CON_Init in WII/libogc #ifndef _WII CON_Init(); #else CON_InitWii(); #endif D_RegisterServerCommands(); D_RegisterClientCommands(); // be sure that this is called before D_CheckNetGame R_RegisterEngineStuff(); S_RegisterSoundStuff(); I_RegisterSysCommands(); //--------------------------------------------------------- CONFIG.CFG M_FirstLoadConfig(); // WARNING : this do a "COM_BufExecute()" if (!M_CheckParm("-resetdata")) G_LoadGameData(); #if (defined (__unix__) && !defined (MSDOS)) || defined (UNIXCOMMON) || defined (SDL) VID_PrepareModeList(); // Regenerate Modelist according to cv_fullscreen #endif // set user default mode or mode set at cmdline SCR_CheckDefaultMode(); wipegamestate = gamestate; P_InitMapHeaders(); savedata.lives = 0; // flag this as not-used //------------------------------------------------ COMMAND LINE PARAMS // Initialize CD-Audio if (M_CheckParm("-usecd") && !dedicated) I_InitCD(); if (M_CheckParm("-nodownloading")) COM_BufAddText("downloading 0\n"); CONS_Printf("%s", M_GetText("M_Init: Init miscellaneous info.\n")); M_Init(); CONS_Printf("%s", M_GetText("R_Init: Init SRB2 refresh daemon - ")); R_Init(); // setting up sound CONS_Printf("%s", M_GetText("S_Init: Setting up sound.\n")); if (M_CheckParm("-nosound")) nosound = true; if (M_CheckParm("-nomusic")) // combines -nomidimusic and -nodigmusic nomidimusic = nodigimusic = true; else { if (M_CheckParm("-nomidimusic")) nomidimusic = true; ; // WARNING: DOS version initmusic in I_StartupSound if (M_CheckParm("-nodigmusic")) nodigimusic = true; // WARNING: DOS version initmusic in I_StartupSound } I_StartupSound(); I_InitMusic(); S_Init(cv_soundvolume.value, cv_digmusicvolume.value, cv_midimusicvolume.value); CONS_Printf("%s", M_GetText("ST_Init: Init status bar.\n")); ST_Init(); if (M_CheckParm("-internetserver")) CV_SetValue(&cv_internetserver, 1); // init all NETWORK CONS_Printf("%s", M_GetText("D_CheckNetGame: Checking network game status.\n")); if (D_CheckNetGame()) autostart = true; // check for a driver that wants intermission stats // start the apropriate game based on parms if (M_CheckParm("-record") && M_IsNextParm()) { G_RecordDemo(M_GetNextParm()); autostart = true; } p = M_CheckParm("-timetic"); if (p) CV_Set(&cv_timetic, "On"); if (!autostart) M_PushSpecialParameters(); // push all "+" parameters at the command buffer // demo doesn't need anymore to be added with D_AddFile() p = M_CheckParm("-playdemo"); if (!p) p = M_CheckParm("-timedemo"); if (p && M_IsNextParm()) { char tmp[MAX_WADPATH]; // add .lmp to identify the EXTERNAL demo file // it is NOT possible to play an internal demo using -playdemo, // rather push a playdemo command.. to do. strcpy(tmp, M_GetNextParm()); // get spaced filename or directory while (M_IsNextParm()) { strcat(tmp, " "); strcat(tmp, M_GetNextParm()); } FIL_DefaultExtension(tmp, ".lmp"); CONS_Printf(M_GetText("Playing demo %s.\n"), tmp); if (M_CheckParm("-playdemo")) { singledemo = true; // quit after one demo G_DeferedPlayDemo(tmp); } else G_TimeDemo(tmp); G_SetGamestate(GS_NULL); wipegamestate = GS_NULL; return; } if (M_CheckParm("-ultimatemode")) { autostart = true; ultimatemode = true; } if (autostart || netgame || M_CheckParm("+connect") || M_CheckParm("-connect")) { gameaction = ga_nothing; CV_ClearChangedFlags(); // Do this here so if you run SRB2 with eg +timelimit 5, the time limit counts // as having been modified for the first game. M_PushSpecialParameters(); // push all "+" parameter at the command buffer if (M_CheckParm("-gametype") && M_IsNextParm()) { // from Command_Map_f INT32 j; INT16 newgametype = -1; const char *sgametype = M_GetNextParm(); for (j = 0; gametype_cons_t[j].strvalue; j++) if (!strcasecmp(gametype_cons_t[j].strvalue, sgametype)) { if (gametype_cons_t[j].value == GTF_TEAMMATCH) { newgametype = GT_MATCH; CV_SetValue(&cv_matchtype, 1); } else if (gametype_cons_t[j].value == GTF_CLASSICRACE) { newgametype = GT_RACE; CV_SetValue(&cv_racetype, 1); } else if (gametype_cons_t[j].value == GTF_HIDEANDSEEK) { newgametype = GT_TAG; CV_SetValue(&cv_tagtype, 1); } else newgametype = (INT16)gametype_cons_t[j].value; break; } if (!gametype_cons_t[j].strvalue) // reached end of the list with no match { j = atoi(sgametype); // assume they gave us a gametype number, which is okay too if (j >= 0 && j < NUMGAMETYPES) newgametype = (INT16)j; } if (newgametype != -1) { j = gametype; gametype = newgametype; D_GameTypeChanged(j); } } if (server && !M_CheckParm("+map") && !M_CheckParm("+connect") && !M_CheckParm("-connect")) { D_MapChange(pstartmap, gametype, ultimatemode, 1, 0, false, false); } } else F_StartIntro(); // Tails 03-03-2002 if (dedicated && server) { pagename = "TITLESKY"; levelstarttic = gametic; G_SetGamestate(GS_LEVEL); if (!P_SetupLevel(gamemap, false)) I_Quit(); // fail so reset game stuff } }
// poly : the convex polygon that encloses all child subsectors static void WalkBSPNode(INT32 bspnum, poly_t *poly, UINT16 *leafnode, fixed_t *bbox) { node_t *bsp; poly_t *backpoly, *frontpoly; fdivline_t fdivline; polyvertex_t *pt; INT32 i; // Found a subsector? if (bspnum & NF_SUBSECTOR) { if (bspnum == -1) { // BP: i think this code is useless and wrong because // - bspnum==-1 happens only when numsubsectors == 0 // - it can't happens in bsp recursive call since bspnum is a INT32 and children is UINT16 // - the BSP is complet !! (there just can have subsector without segs) (i am not sure of this point) // do we have a valid polygon ? if (poly && poly->numpts > 2) { DEBPRINT("Adding a new subsector\n"); if (addsubsector == numsubsectors + NEWSUBSECTORS) I_Error("WalkBSPNode: not enough addsubsectors\n"); else if (addsubsector > 0x7fff) I_Error("WalkBSPNode: addsubsector > 0x7fff\n"); *leafnode = (UINT16)((UINT16)addsubsector | NF_SUBSECTOR); extrasubsectors[addsubsector].planepoly = poly; addsubsector++; } //add subsectors without segs here? //HWR_SubsecPoly(0, NULL); } else { HWR_SubsecPoly(bspnum&(~NF_SUBSECTOR), poly); //Hurdler: implement a loading status if (ls_count-- <= 0) { char s[16]; int x, y; I_OsPolling(); ls_count = numsubsectors/50; CON_Drawer(); sprintf(s, "%d%%", (++ls_percent)<<1); x = BASEVIDWIDTH/2; y = BASEVIDHEIGHT/2; V_DrawFill(0, 0, vid.width, vid.height, 31); // Black background to match fade in effect //V_DrawPatchFill(W_CachePatchName("SRB2BACK",PU_CACHE)); // SRB2 background, ehhh too bright. M_DrawTextBox(x-58, y-8, 13, 1); V_DrawString(x-50, y, V_YELLOWMAP, "Loading..."); V_DrawString(x+50-V_StringWidth(s), y, V_YELLOWMAP, s); // Is this really necessary at this point..? V_DrawCenteredString(BASEVIDWIDTH/2, 40, V_YELLOWMAP, "OPENGL MODE IS INCOMPLETE AND MAY"); V_DrawCenteredString(BASEVIDWIDTH/2, 50, V_YELLOWMAP, "NOT DISPLAY SOME SURFACES."); V_DrawCenteredString(BASEVIDWIDTH/2, 70, V_YELLOWMAP, "USE AT SONIC'S RISK."); I_UpdateNoVsync(); } } M_ClearBox(bbox); poly = extrasubsectors[bspnum&~NF_SUBSECTOR].planepoly; for (i = 0, pt = poly->pts; i < poly->numpts; i++,pt++) M_AddToBox(bbox, FLOAT_TO_FIXED(pt->x), FLOAT_TO_FIXED(pt->y)); return; } bsp = &nodes[bspnum]; SearchDivline(bsp, &fdivline); SplitPoly(&fdivline, poly, &frontpoly, &backpoly); poly = NULL; //debug if (!backpoly) nobackpoly++; // Recursively divide front space. if (frontpoly) { WalkBSPNode(bsp->children[0], frontpoly, &bsp->children[0],bsp->bbox[0]); // copy child bbox M_Memcpy(bbox, bsp->bbox[0], 4*sizeof (fixed_t)); } else I_Error("WalkBSPNode: no front poly?"); // Recursively divide back space. if (backpoly) { // Correct back bbox to include floor/ceiling convex polygon WalkBSPNode(bsp->children[1], backpoly, &bsp->children[1], bsp->bbox[1]); // enlarge bbox with seconde child M_AddToBox(bbox, bsp->bbox[1][BOXLEFT ], bsp->bbox[1][BOXTOP ]); M_AddToBox(bbox, bsp->bbox[1][BOXRIGHT ], bsp->bbox[1][BOXBOTTOM]); } }