static int AshmemCreateFileMapping(const char *name, size_t size) { int fd, ret; fd = open(ASHMEM_DEVICE, O_RDWR); if (fd < 0) return fd; // We don't really care if we can't set the name, it is optional ioctl(fd, ASHMEM_SET_NAME, name); ret = ioctl(fd, ASHMEM_SET_SIZE, size); if (ret < 0) { close(fd); NOTICE_LOG(MEMMAP, "Ashmem returned error: 0x%08x", ret); return ret; } return fd; }
// Close backend void cInterfaceWGL::Shutdown() { if (hRC) { if (!wglMakeCurrent(nullptr, nullptr)) NOTICE_LOG(VIDEO, "Could not release drawing context."); if (!wglDeleteContext(hRC)) ERROR_LOG(VIDEO, "Attempt to release rendering context failed."); hRC = nullptr; } if (hDC && !ReleaseDC(m_window_handle, hDC)) { ERROR_LOG(VIDEO, "Attempt to release device context failed."); hDC = nullptr; } }
void GPU_Vulkan::BeginHostFrame() { drawEngine_.BeginFrame(); UpdateCmdInfo(); if (resized_) { CheckGPUFeatures(); // In case the GPU changed. BuildReportingInfo(); framebufferManager_->Resized(); drawEngine_.Resized(); textureCacheVulkan_->NotifyConfigChanged(); if (vulkan_->GetFeaturesEnabled ().wideLines) { drawEngine_.SetLineWidth(PSP_CoreParameter().renderWidth / 480.0f); } } resized_ = false; textureCacheVulkan_->StartFrame(); int curFrame = vulkan_->GetCurFrame(); FrameData &frame = frameData_[curFrame]; frame.push_->Reset(); frame.push_->Begin(vulkan_); framebufferManagerVulkan_->BeginFrameVulkan(); framebufferManagerVulkan_->SetPushBuffer(frameData_[curFrame].push_); depalShaderCache_.SetPushBuffer(frameData_[curFrame].push_); textureCacheVulkan_->SetPushBuffer(frameData_[curFrame].push_); vulkan2D_.BeginFrame(); shaderManagerVulkan_->DirtyShader(); gstate_c.Dirty(DIRTY_ALL); if (dumpNextFrame_) { NOTICE_LOG(G3D, "DUMPING THIS FRAME"); dumpThisFrame_ = true; dumpNextFrame_ = false; } else if (dumpThisFrame_) { dumpThisFrame_ = false; } }
EmuScreen::EmuScreen(const std::string &filename) : invalid_(true) { std::string fileToStart = filename; // This is probably where we should start up the emulated PSP. INFO_LOG(BOOT, "Starting up hardware."); CoreParameter coreParam; coreParam.cpuCore = (CPUCore)g_Config.iCpuCore; #if defined(ARM) if (coreParam.cpuCore == CPU_JIT) coreParam.cpuCore = CPU_FASTINTERPRETER; #endif coreParam.gpuCore = GPU_GLES; coreParam.enableSound = g_Config.bEnableSound; coreParam.fileToStart = fileToStart; coreParam.mountIso = ""; coreParam.startPaused = false; coreParam.enableDebugging = false; coreParam.printfEmuLog = false; coreParam.headLess = false; if (g_Config.iWindowZoom < 1 || g_Config.iWindowZoom > 2) g_Config.iWindowZoom = 1; coreParam.renderWidth = 480 * g_Config.iWindowZoom; coreParam.renderHeight = 272 * g_Config.iWindowZoom; coreParam.outputWidth = dp_xres; coreParam.outputHeight = dp_yres; coreParam.pixelWidth = pixel_xres; coreParam.pixelHeight = pixel_yres; coreParam.useMediaEngine = false; std::string error_string; if (PSP_Init(coreParam, &error_string)) { invalid_ = false; } else { invalid_ = true; errorMessage_ = error_string; ERROR_LOG(BOOT, "%s", errorMessage_.c_str()); return; } LayoutGamepad(dp_xres, dp_yres); NOTICE_LOG(BOOT, "Loading %s...", fileToStart.c_str()); }
void* MemArena::CreateView(s64 offset, size_t size, void* base) { #ifdef _WIN32 return MapViewOfFileEx(hMemoryMapping, FILE_MAP_ALL_ACCESS, 0, (DWORD)((u64)offset), size, base); #else void* retval = mmap(base, size, PROT_READ | PROT_WRITE, MAP_SHARED | ((base == nullptr) ? 0 : MAP_FIXED), fd, offset); if (retval == MAP_FAILED) { NOTICE_LOG(MEMMAP, "mmap failed"); return nullptr; } else { return retval; } #endif }
// Don't even log these by default, they're spammy and we probably won't // need to emulate them. Useful for invalidating cached textures though, // and in the future display lists (although hashing takes care of those // for now). int sceKernelDcacheInvalidateRange(u32 addr, int size) { #ifdef LOG_CACHE NOTICE_LOG(CPU,"sceKernelDcacheInvalidateRange(%08x, %i)", addr, size); #endif if (size < 0 || (int) addr + size < 0) return SCE_KERNEL_ERROR_ILLEGAL_ADDR; if (size > 0) { if ((addr % 64) != 0 || (size % 64) != 0) return SCE_KERNEL_ERROR_CACHE_ALIGNMENT; if (addr != 0) gpu->InvalidateCache(addr, size, GPU_INVALIDATE_HINT); } hleEatCycles(190); return 0; }
void SConfig::SaveSettings() { NOTICE_LOG(BOOT, "Saving settings to %s", File::GetUserPath(F_DOLPHINCONFIG_IDX).c_str()); IniFile ini; ini.Load(File::GetUserPath(F_DOLPHINCONFIG_IDX)); // load first to not kill unknown stuff SaveGeneralSettings(ini); SaveInterfaceSettings(ini); SaveDisplaySettings(ini); SaveGameListSettings(ini); SaveCoreSettings(ini); SaveMovieSettings(ini); SaveDSPSettings(ini); SaveInputSettings(ini); SaveFifoPlayerSettings(ini); ini.Save(File::GetUserPath(F_DOLPHINCONFIG_IDX)); m_SYSCONF->Save(); }
LinkedShader::LinkedShader(Shader *vs, Shader *fs) : program(0), dirtyUniforms(0) { program = glCreateProgram(); glAttachShader(program, vs->shader); glAttachShader(program, fs->shader); glLinkProgram(program); GLint linkStatus; glGetProgramiv(program, GL_LINK_STATUS, &linkStatus); if (linkStatus != GL_TRUE) { GLint bufLength = 0; glGetProgramiv(program, GL_INFO_LOG_LENGTH, &bufLength); if (bufLength) { char* buf = new char[bufLength]; glGetProgramInfoLog(program, bufLength, NULL, buf); ERROR_LOG(G3D, "Could not link program:\n %s", buf); delete [] buf; // we're dead! //_dbg_assert_msg_(HLE,0,"Could not link program"); } return; } NOTICE_LOG(G3D, "Linked shader!"); u_tex = glGetUniformLocation(program, "tex"); u_proj = glGetUniformLocation(program, "u_proj"); u_texenv = glGetUniformLocation(program, "u_texenv"); u_fogcolor = glGetUniformLocation(program, "u_fogcolor"); u_fogparam = glGetUniformLocation(program, "u_fogparam"); u_alpharef = glGetUniformLocation(program, "u_alpharef"); a_position = glGetAttribLocation(program, "a_position"); a_color0 = glGetAttribLocation(program, "a_color0"); a_color1 = glGetAttribLocation(program, "a_color1"); a_texcoord = glGetAttribLocation(program, "a_texcoord"); glUseProgram(program); // Default uniform values glUniform1i(u_tex, 0); // The rest, use the "dirty" mechanism. dirtyUniforms = DIRTY_PROJMATRIX | DIRTY_TEXENV | DIRTY_ALPHAREF; }
void Close() { // we can't release the swapchain while in fullscreen. swapchain->SetFullscreenState(false, nullptr); // release all bound resources context->ClearState(); SAFE_RELEASE(backbuf); SAFE_RELEASE(swapchain); SAFE_DELETE(stateman); context->Flush(); // immediately destroy device objects SAFE_RELEASE(context); ULONG references = device->Release(); #if defined(_DEBUG) || defined(DEBUGFAST) if (debug) { --references; // the debug interface increases the refcount of the device, subtract that. if (references) { // print out alive objects, but only if we actually have pending references // note this will also print out internal live objects to the debug console debug->ReportLiveDeviceObjects(D3D11_RLDO_SUMMARY | D3D11_RLDO_DETAIL); } SAFE_RELEASE(debug) } #endif if (references) { ERROR_LOG(VIDEO, "Unreleased references: %i.", references); } else { NOTICE_LOG(VIDEO, "Successfully released all device references!"); } device = nullptr; // unload DLLs UnloadD3D(); UnloadDXGI(); }
// Close backend void cInterfaceWGL::Shutdown() { if (hRC) { if (!wglMakeCurrent(NULL, NULL)) NOTICE_LOG(VIDEO, "Could not release drawing context."); if (!wglDeleteContext(hRC)) ERROR_LOG(VIDEO, "Attempt to release rendering context failed."); hRC = NULL; } if (hDC && !ReleaseDC(EmuWindow::GetWnd(), hDC)) { ERROR_LOG(VIDEO, "Attempt to release device context failed."); hDC = NULL; } }
u32 DSPHost_CodeLoaded(const u8 *ptr, int size) { u32 ector_crc = HashEctor(ptr, size); #if defined(_DEBUG) || defined(DEBUGFAST) DumpDSPCode(ptr, size, ector_crc); #endif DSPSymbols::Clear(); // Auto load text file - if none just disassemble. NOTICE_LOG(DSPLLE, "ector_crc: %08x", ector_crc); DSPSymbols::Clear(); bool success = false; switch (ector_crc) { case 0x86840740: success = DSPSymbols::ReadAnnotatedAssembly("../../docs/DSP/DSP_UC_Zelda.txt"); break; case 0x42f64ac4: success = DSPSymbols::ReadAnnotatedAssembly("../../docs/DSP/DSP_UC_Luigi.txt"); break; case 0x07f88145: success = DSPSymbols::ReadAnnotatedAssembly("../../docs/DSP/DSP_UC_AX_07F88145.txt"); break; case 0x3ad3b7ac: success = DSPSymbols::ReadAnnotatedAssembly("../../docs/DSP/DSP_UC_AX_3AD3B7AC.txt"); break; case 0x3daf59b9: success = DSPSymbols::ReadAnnotatedAssembly("../../docs/DSP/DSP_UC_AX_3DAF59B9.txt"); break; case 0x4e8a8b21: success = DSPSymbols::ReadAnnotatedAssembly("../../docs/DSP/DSP_UC_AX_4E8A8B21.txt"); break; case 0xe2136399: success = DSPSymbols::ReadAnnotatedAssembly("../../docs/DSP/DSP_UC_AX_E2136399.txt"); break; case 0xdd7e72d5: success = DSPSymbols::ReadAnnotatedAssembly("../../docs/DSP/DSP_UC_GBA.txt"); break; case 0x347112BA: success = DSPSymbols::ReadAnnotatedAssembly("../../docs/DSP/DSP_UC_AXWii.txt"); break; case 0xD643001F: success = DSPSymbols::ReadAnnotatedAssembly("../../docs/DSP/DSP_UC_SuperMarioGalaxy.txt"); break; default: success = false; break; } if (!success) { DSPSymbols::AutoDisassembly(0x0, 0x1000); } // Always add the ROM. DSPSymbols::AutoDisassembly(0x8000, 0x9000); DSPHost_UpdateDebugger(); return ector_crc; }
IVolume* CreateVolumeFromFilename(const std::string& _rFilename, u32 _PartitionGroup, u32 _VolumeNum) { IBlobReader* pReader = CreateBlobReader(_rFilename); if (pReader == nullptr) return nullptr; switch (GetDiscType(*pReader)) { case DISC_TYPE_WII: case DISC_TYPE_GC: return new CVolumeGC(pReader); case DISC_TYPE_WAD: return new CVolumeWAD(pReader); case DISC_TYPE_WII_CONTAINER: { u8 region; pReader->Read(0x3,1,®ion); IVolume* pVolume = CreateVolumeFromCryptedWiiImage(*pReader, _PartitionGroup, 0, _VolumeNum, region == 'K'); if (pVolume == nullptr) { delete pReader; } return pVolume; } case DISC_TYPE_UNK: default: std::string Filename, ext; SplitPath(_rFilename, nullptr, &Filename, &ext); Filename += ext; NOTICE_LOG(DISCIO, "%s does not have the Magic word for a gcm, wiidisc or wad file\n" "Set Log Verbosity to Warning and attempt to load the game again to view the values", Filename.c_str()); delete pReader; } return nullptr; }
HRESULT HLSLCompiler::LoadCompiler() { if (d3dcompiler_dll_ref++ > 0) return S_OK; if (hD3DCompilerDll) return S_OK; // try to load D3DCompiler HRESULT hr = E_FAIL; for (unsigned int num = 49; num >= 42; --num) { std::string compilerfile = StringFromFormat("D3DCompiler_%d.dll", num); hD3DCompilerDll = LoadLibraryA(compilerfile.c_str()); if (hD3DCompilerDll != nullptr) { NOTICE_LOG(VIDEO, "Successfully loaded %s.", compilerfile.c_str()); hr = S_OK; break; } } if (FAILED(hr)) { MessageBoxA( nullptr, "Failed to load any D3DCompiler dll", "Critical error", MB_OK | MB_ICONERROR); return hr; } PD3DCompile = (pD3DCompile)GetProcAddress(hD3DCompilerDll, "D3DCompile"); if (PD3DCompile == nullptr) MessageBoxA(nullptr, "GetProcAddress failed for D3DCompile!", "Critical error", MB_OK | MB_ICONERROR); PD3DReflect = (D3DREFLECT)GetProcAddress(hD3DCompilerDll, "D3DReflect"); if (PD3DReflect == NULL) MessageBoxA(NULL, "GetProcAddress failed for D3DReflect!", "Critical error", MB_OK | MB_ICONERROR); return S_OK; }
void GetServiceHandle(Service::Interface* self) { Syscall::Result res = 0; u32* cmd_buff = (u32*)HLE::GetPointer(HLE::CMD_BUFFER_ADDR + Service::kCommandHeaderOffset); std::string port_name = std::string((const char*)&cmd_buff[1], 0, Service::kMaxPortSize); Service::Interface* service = Service::g_manager->FetchFromPortName(port_name); NOTICE_LOG(OSHLE, "SRV::Sync - GetHandle - port: %s, handle: 0x%08X", port_name.c_str(), service->GetUID()); if (NULL != service) { cmd_buff[3] = service->GetUID(); } else { ERROR_LOG(OSHLE, "Service %s does not exist", port_name.c_str()); res = -1; } cmd_buff[1] = res; //return res; }
void MemArena::GrabLowMemSpace(size_t size) { #ifdef _WIN32 hMemoryMapping = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, (DWORD)(size), NULL); #elif defined(ANDROID) fd = AshmemCreateFileMapping("Dolphin-emu", size); if (fd < 0) { NOTICE_LOG(MEMMAP, "Ashmem allocation failed"); return; } #else mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; fd = open(ram_temp_file, O_RDWR | O_CREAT, mode); unlink(ram_temp_file); if (ftruncate(fd, size) < 0) ERROR_LOG(MEMMAP, "Failed to allocate low memory space"); return; #endif }
inline void init_lib() { static bool initialized = false; if (!initialized) { // Only try once initialized = true; // After these calls, we know all dynamically loaded APIs will either all be valid or // all nullptr. if (!load_hid() || !load_bthprops()) { NOTICE_LOG(WIIMOTE, "Failed to load Bluetooth support libraries, Wiimotes will not function"); return; } s_loaded_ok = true; } }
static void gdsp_idma_in(u16 dsp_addr, u32 addr, u32 size) { UnWriteProtectMemory(g_dsp.iram, DSP_IRAM_BYTE_SIZE, false); u8* dst = ((u8*)g_dsp.iram); for (u32 i = 0; i < size; i += 2) { *(u16*)&dst[dsp_addr + i] = Common::swap16(*(const u16*)&g_dsp.cpu_ram[(addr + i) & 0x0fffffff]); } WriteProtectMemory(g_dsp.iram, DSP_IRAM_BYTE_SIZE, false); g_dsp.iram_crc = DSPHost_CodeLoaded(g_dsp.cpu_ram + (addr & 0x0fffffff), size); NOTICE_LOG(DSPLLE, "*** Copy new UCode from 0x%08x to 0x%04x (crc: %8x)", addr, dsp_addr, g_dsp.iram_crc); if (dspjit) dspjit->ClearIRAM(); DSPAnalyzer::Analyze(); }
WiimoteScanner::WiimoteScanner() : device_id(-1) , device_sock(-1) { // Get the id of the first Bluetooth device. device_id = hci_get_route(nullptr); if (device_id < 0) { NOTICE_LOG(WIIMOTE, "Bluetooth not found."); return; } // Create a socket to the device device_sock = hci_open_dev(device_id); if (device_sock < 0) { ERROR_LOG(WIIMOTE, "Unable to open Bluetooth."); return; } }
void ShaderManagerVulkan::SaveCache(FILE *f) { VulkanCacheHeader header{}; header.magic = CACHE_HEADER_MAGIC; header.version = CACHE_VERSION; header.featureFlags = gstate_c.featureFlags; header.reserved = 0; header.numVertexShaders = (int)vsCache_.size(); header.numFragmentShaders = (int)fsCache_.size(); bool writeFailed = fwrite(&header, sizeof(header), 1, f) != 1; vsCache_.Iterate([&](const VShaderID &id, VulkanVertexShader *vs) { writeFailed = writeFailed || fwrite(&id, sizeof(id), 1, f) != 1; }); fsCache_.Iterate([&](const FShaderID &id, VulkanFragmentShader *fs) { writeFailed = writeFailed || fwrite(&id, sizeof(id), 1, f) != 1; }); if (writeFailed) { ERROR_LOG(G3D, "Failed to write Vulkan shader cache, disk full?"); } else { NOTICE_LOG(G3D, "Saved %d vertex and %d fragment shaders", header.numVertexShaders, header.numFragmentShaders); } }
// FIXME: stmw should do a total rollback if a DSI occurs void Interpreter::stmw(UGeckoInstruction inst) { u32 address = Helper_Get_EA(inst); if ((address & 0b11) != 0 || UReg_MSR{MSR}.LE) { GenerateAlignmentException(address); return; } for (int i = inst.RS; i <= 31; i++, address += 4) { PowerPC::Write_U32(rGPR[i], address); if (PowerPC::ppcState.Exceptions & EXCEPTION_DSI) { PanicAlert("DSI exception in stmw"); NOTICE_LOG(POWERPC, "DSI exception in stmw"); return; } } }
bool LibusbDevice::Attach() { if (m_device_attached) return true; if (!m_handle) { NOTICE_LOG(IOS_USB, "[%04x:%04x] Opening device", m_vid, m_pid); const int ret = libusb_open(m_device, &m_handle); if (ret != 0) { ERROR_LOG(IOS_USB, "[%04x:%04x] Failed to open: %s", m_vid, m_pid, libusb_error_name(ret)); m_handle = nullptr; return false; } } if (ClaimAllInterfaces(DEFAULT_CONFIG_NUM) < 0) return false; m_device_attached = true; return true; }
void Host_SetWiiMoteConnectionState(int _State) { static int currentState = -1; if (_State == currentState) return; currentState = _State; wxCommandEvent event(wxEVT_HOST_COMMAND, IDM_UPDATESTATUSBAR); switch (_State) { case 0: event.SetString(_("Not connected")); break; case 1: event.SetString(_("Connecting...")); break; case 2: event.SetString(_("Wiimote Connected")); break; } // Update field 1 or 2 event.SetInt(1); NOTICE_LOG(WIIMOTE, "%s", static_cast<const char*>(event.GetString().c_str())); main_frame->GetEventHandler()->AddPendingEvent(event); }
bool GPUCommon::InterpretList(DisplayList &list) { currentList = &list; // Reset stackptr for safety stackptr = 0; u32 op = 0; prev = 0; finished = false; while (!finished) { list.status = PSP_GE_LIST_DRAWING; if (!Memory::IsValidAddress(list.pc)) { ERROR_LOG(G3D, "DL PC = %08x WTF!!!!", list.pc); return true; } if (list.pc == list.stall) { list.status = PSP_GE_LIST_STALL_REACHED; return false; } op = Memory::ReadUnchecked_U32(list.pc); //read from memory u32 cmd = op >> 24; u32 diff = op ^ gstate.cmdmem[cmd]; PreExecuteOp(op, diff); // TODO: Add a compiler flag to remove stuff like this at very-final build time. if (dumpThisFrame_) { char temp[256]; GeDisassembleOp(list.pc, op, prev, temp); NOTICE_LOG(G3D, "%s", temp); } gstate.cmdmem[cmd] = op; // crashes if I try to put the whole op there?? ExecuteOp(op, diff); list.pc += 4; prev = op; } return true; }
void SConfig::SaveSettings() { NOTICE_LOG(BOOT, "Saving settings to %s", File::GetUserPath(F_DOLPHINCONFIG_IDX).c_str()); IniFile ini; ini.Load(File::GetUserPath(F_DOLPHINCONFIG_IDX)); // load first to not kill unknown stuff SaveGeneralSettings(ini); SaveInterfaceSettings(ini); SaveDisplaySettings(ini); SaveGameListSettings(ini); SaveCoreSettings(ini); SaveMovieSettings(ini); SaveDSPSettings(ini); SaveInputSettings(ini); SaveFifoPlayerSettings(ini); SaveAnalyticsSettings(ini); SaveNetworkSettings(ini); SaveBluetoothPassthroughSettings(ini); SaveSysconfSettings(ini); ini.Save(File::GetUserPath(F_DOLPHINCONFIG_IDX)); }
// Removes remembered non-connected devices bool ForgetWiimote(BLUETOOTH_DEVICE_INFO_STRUCT& btdi) { if (!btdi.fConnected && btdi.fRemembered) { // Time to avoid RemoveDevice after SetServiceState. // Sometimes SetServiceState takes a while.. auto const avoid_forget_seconds = 5.0; auto pair_time = g_connect_times.find(btdi.Address.ullLong); if (pair_time == g_connect_times.end() || std::difftime(time(nullptr), pair_time->second) >= avoid_forget_seconds) { // Make Windows forget about device so it will re-find it if visible. // This is also required to detect a disconnect for some reason.. NOTICE_LOG(WIIMOTE, "Removing remembered Wiimote."); pBluetoothRemoveDevice(&btdi.Address); return true; } } return false; }
u32 sceKernelLoadModuleByID(u32 id, u32 flags, u32 lmoptionPtr) { u32 error; u32 handle = __IoGetFileHandleFromId(id, error); if (handle == (u32)-1) { ERROR_LOG(HLE,"sceKernelLoadModuleByID(%08x, %08x, %08x): could not open file id",id,flags,lmoptionPtr); return error; } SceKernelLMOption *lmoption = 0; if (lmoptionPtr) { lmoption = (SceKernelLMOption *)Memory::GetPointer(lmoptionPtr); } u32 pos = (u32) pspFileSystem.SeekFile(handle, 0, FILEMOVE_CURRENT); size_t size = pspFileSystem.SeekFile(handle, 0, FILEMOVE_END); std::string error_string; pspFileSystem.SeekFile(handle, pos, FILEMOVE_BEGIN); Module *module = 0; u8 *temp = new u8[size]; pspFileSystem.ReadFile(handle, temp, size); module = __KernelLoadELFFromPtr(temp, 0, &error_string); delete [] temp; if (!module) { // Module was blacklisted or couldn't be decrypted, which means it's a kernel module we don't want to run. // Let's just act as if it worked. NOTICE_LOG(LOADER, "Module %d is blacklisted or undecryptable - we lie about success", id); return 1; } if (lmoption) { INFO_LOG(HLE,"%i=sceKernelLoadModuleByID(%d,flag=%08x,%08x,%08x,%08x,position = %08x)", module->GetUID(),id,flags, lmoption->size,lmoption->mpidtext,lmoption->mpiddata,lmoption->position); } else { INFO_LOG(HLE,"%i=sceKernelLoadModuleByID(%d,flag=%08x,(...))", module->GetUID(), id, flags); } return module->GetUID(); }
void UpdateWantDeterminism(bool initial) { // For now, this value is not itself configurable. Instead, individual // settings that depend on it, such as GPU determinism mode. should have // override options for testing, bool new_want_determinism = Movie::IsMovieActive() || NetPlay::IsNetPlayRunning(); if (new_want_determinism != g_want_determinism || initial) { NOTICE_LOG(COMMON, "Want determinism <- %s", new_want_determinism ? "true" : "false"); bool was_unpaused = Core::PauseAndLock(true); g_want_determinism = new_want_determinism; WiiSockMan::GetInstance().UpdateWantDeterminism(new_want_determinism); Fifo::UpdateWantDeterminism(new_want_determinism); // We need to clear the cache because some parts of the JIT depend on want_determinism, e.g. use // of FMA. JitInterface::ClearCache(); Common::InitializeWiiRoot(g_want_determinism); Core::PauseAndLock(false, was_unpaused); } }
/// Initialize the renderer void RendererOpenGL::Init() { m_render_window->MakeCurrent(); glShadeModel(GL_SMOOTH); glStencilFunc(GL_ALWAYS, 0, 0); glBlendFunc(GL_ONE, GL_ONE); glViewport(0, 0, m_resolution_width, m_resolution_height); glClearDepth(1.0f); glEnable(GL_DEPTH_TEST); glDisable(GL_LIGHTING); glDepthFunc(GL_LEQUAL); glPixelStorei(GL_UNPACK_ALIGNMENT, 4); glDisable(GL_STENCIL_TEST); glEnable(GL_SCISSOR_TEST); glScissor(0, 0, m_resolution_width, m_resolution_height); glClearDepth(1.0f); GLenum err = glewInit(); if (GLEW_OK != err) { ERROR_LOG(RENDER, "Failed to initialize GLEW! Error message: \"%s\". Exiting...", glewGetErrorString(err)); exit(-1); } // Initialize everything else // -------------------------- InitFramebuffer(); NOTICE_LOG(RENDER, "GL_VERSION: %s\n", glGetString(GL_VERSION)); }
HRESULT LoadD3DX() { if (d3dx_dll_ref++ > 0) return S_OK; if (hD3DXDll) return S_OK; // try to load D3DX11 first to check whether we have proper runtime support // try to use the dll the backend was compiled against first - don't bother about debug runtimes hD3DXDll = LoadLibraryA(D3DX11_DLL_A); if (!hD3DXDll) { // if that fails, use the dll which should be available in every SDK which officially supports DX11. hD3DXDll = LoadLibraryA("d3dx11_42.dll"); if (!hD3DXDll) { MessageBoxA(NULL, "Failed to load d3dx11_42.dll, update your DX11 runtime, please", "Critical error", MB_OK | MB_ICONERROR); return E_FAIL; } else { NOTICE_LOG(VIDEO, "Successfully loaded d3dx11_42.dll. If you're having trouble, try updating your DX runtime first."); } } PD3DX11CompileFromMemory = (D3DX11COMPILEFROMMEMORYTYPE)GetProcAddress(hD3DXDll, "D3DX11CompileFromMemory"); if (PD3DX11CompileFromMemory == NULL) MessageBoxA(NULL, "GetProcAddress failed for D3DX11CompileFromMemory!", "Critical error", MB_OK | MB_ICONERROR); PD3DX11FilterTexture = (D3DX11FILTERTEXTURETYPE)GetProcAddress(hD3DXDll, "D3DX11FilterTexture"); if (PD3DX11FilterTexture == NULL) MessageBoxA(NULL, "GetProcAddress failed for D3DX11FilterTexture!", "Critical error", MB_OK | MB_ICONERROR); PD3DX11SaveTextureToFileA = (D3DX11SAVETEXTURETOFILEATYPE)GetProcAddress(hD3DXDll, "D3DX11SaveTextureToFileA"); if (PD3DX11SaveTextureToFileA == NULL) MessageBoxA(NULL, "GetProcAddress failed for D3DX11SaveTextureToFileA!", "Critical error", MB_OK | MB_ICONERROR); PD3DX11SaveTextureToFileW = (D3DX11SAVETEXTURETOFILEWTYPE)GetProcAddress(hD3DXDll, "D3DX11SaveTextureToFileW"); if (PD3DX11SaveTextureToFileW == NULL) MessageBoxA(NULL, "GetProcAddress failed for D3DX11SaveTextureToFileW!", "Critical error", MB_OK | MB_ICONERROR); return S_OK; }
u32 JitBreakpoint() { // Should we skip this breakpoint? if (CBreakPoints::CheckSkipFirst() == currentMIPS->pc) return 0; auto cond = CBreakPoints::GetBreakPointCondition(currentMIPS->pc); if (cond && !cond->Evaluate()) return 0; Core_EnableStepping(true); host->SetDebugMode(true); // There's probably a better place for this. if (USE_JIT_MISSMAP) { std::map<u32, std::string> notJitSorted; std::transform(notJitOps.begin(), notJitOps.end(), std::inserter(notJitSorted, notJitSorted.begin()), flip_pair<std::string, u32>); std::string message; char temp[256]; int remaining = 15; for (auto it = notJitSorted.rbegin(), end = notJitSorted.rend(); it != end && --remaining >= 0; ++it) { snprintf(temp, 256, " (%d), ", it->first); message += it->second + temp; } if (message.size() > 2) message.resize(message.size() - 2); NOTICE_LOG(JIT, "Top ops compiled to interpreter: %s", message.c_str()); } return 1; }