GLES_GPU::GLES_GPU() : resized_(false) { shaderManager_ = new ShaderManager(); transformDraw_.SetShaderManager(shaderManager_); transformDraw_.SetTextureCache(&textureCache_); transformDraw_.SetFramebufferManager(&framebufferManager_); framebufferManager_.SetTextureCache(&textureCache_); framebufferManager_.SetShaderManager(shaderManager_); // Sanity check gstate if ((int *)&gstate.transferstart - (int *)&gstate != 0xEA) { ERROR_LOG(G3D, "gstate has drifted out of sync!"); } flushBeforeCommand_ = new u8[256]; memset(flushBeforeCommand_, 0, 256 * sizeof(bool)); for (size_t i = 0; i < ARRAY_SIZE(flushOnChangedBeforeCommandList); i++) { flushBeforeCommand_[flushOnChangedBeforeCommandList[i]] = 2; } for (size_t i = 0; i < ARRAY_SIZE(flushBeforeCommandList); i++) { flushBeforeCommand_[flushBeforeCommandList[i]] = 1; } flushBeforeCommand_[1] = 0; BuildReportingInfo(); }
GLES_GPU::GLES_GPU() : resized_(false) { lastVsync_ = g_Config.iVSyncInterval; if (gl_extensions.EXT_swap_control_tear) { // See http://developer.download.nvidia.com/opengl/specs/WGL_EXT_swap_control_tear.txt glstate.SetVSyncInterval(-g_Config.iVSyncInterval); } else { glstate.SetVSyncInterval(g_Config.iVSyncInterval); } shaderManager_ = new ShaderManager(); transformDraw_.SetShaderManager(shaderManager_); transformDraw_.SetTextureCache(&textureCache_); transformDraw_.SetFramebufferManager(&framebufferManager_); framebufferManager_.SetTextureCache(&textureCache_); framebufferManager_.SetShaderManager(shaderManager_); // Sanity check gstate if ((int *)&gstate.transferstart - (int *)&gstate != 0xEA) { ERROR_LOG(G3D, "gstate has drifted out of sync!"); } flushBeforeCommand_ = new u8[256]; memset(flushBeforeCommand_, 0, 256 * sizeof(bool)); for (size_t i = 0; i < ARRAY_SIZE(flushOnChangedBeforeCommandList); i++) { flushBeforeCommand_[flushOnChangedBeforeCommandList[i]] = 2; } for (size_t i = 0; i < ARRAY_SIZE(flushBeforeCommandList); i++) { flushBeforeCommand_[flushBeforeCommandList[i]] = 1; } flushBeforeCommand_[1] = 0; BuildReportingInfo(); }
void GPU_Vulkan::BeginHostFrame() { if (g_Config.iRenderingMode == FB_NON_BUFFERED_MODE) { // Draw everything directly to the backbuffer. drawEngine_.SetCmdBuffer(vulkan_->GetSurfaceCommandBuffer()); } drawEngine_.BeginFrame(); if (resized_) { CheckGPUFeatures(); // In case the GPU changed. BuildReportingInfo(); UpdateCmdInfo(); drawEngine_.Resized(); textureCacheVulkan_->NotifyConfigChanged(); } resized_ = false; textureCacheVulkan_->StartFrame(); depalShaderCache_.Decimate(); framebufferManagerVulkan_->BeginFrameVulkan(); shaderManagerVulkan_->DirtyShader(); gstate_c.Dirty(DIRTY_ALL); if (dumpNextFrame_) { NOTICE_LOG(G3D, "DUMPING THIS FRAME"); dumpThisFrame_ = true; dumpNextFrame_ = false; } else if (dumpThisFrame_) { dumpThisFrame_ = false; } }
GLES_GPU::GLES_GPU() : resized_(false) { lastVsync_ = g_Config.bVSync ? 1 : 0; if (gl_extensions.EXT_swap_control_tear) { // See http://developer.download.nvidia.com/opengl/specs/WGL_EXT_swap_control_tear.txt glstate.SetVSyncInterval(g_Config.bVSync ? -1 :0); } else { glstate.SetVSyncInterval(g_Config.bVSync ? 1 : 0); } shaderManager_ = new ShaderManager(); transformDraw_.SetShaderManager(shaderManager_); transformDraw_.SetTextureCache(&textureCache_); transformDraw_.SetFramebufferManager(&framebufferManager_); framebufferManager_.SetTextureCache(&textureCache_); framebufferManager_.SetShaderManager(shaderManager_); // Sanity check gstate if ((int *)&gstate.transferstart - (int *)&gstate != 0xEA) { ERROR_LOG(G3D, "gstate has drifted out of sync!"); } // Sanity check commandFlags table - no dupes please std::set<u8> dupeCheck; commandFlags_ = new u8[256]; memset(commandFlags_, 0, 256 * sizeof(bool)); for (size_t i = 0; i < ARRAY_SIZE(commandTable); i++) { u8 cmd = commandTable[i].cmd; if (dupeCheck.find(cmd) != dupeCheck.end()) { ERROR_LOG(G3D, "Command table Dupe: %02x (%i)", (int)cmd, (int)cmd); } else { dupeCheck.insert(cmd); } commandFlags_[cmd] |= commandTable[i].flags; } // Find commands missing from the table. for (int i = 0; i < 0xEF; i++) { if (dupeCheck.find((u8)i) == dupeCheck.end()) { ERROR_LOG(G3D, "Command missing from table: %02x (%i)", i, i); } } BuildReportingInfo(); }
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; } }
DIRECTX9_GPU::DIRECTX9_GPU() : resized_(false) { lastVsync_ = g_Config.bVSync ? 1 : 0; dxstate.SetVSyncInterval(g_Config.bVSync); shaderManager_ = new ShaderManagerDX9(); transformDraw_.SetShaderManager(shaderManager_); transformDraw_.SetTextureCache(&textureCache_); transformDraw_.SetFramebufferManager(&framebufferManager_); framebufferManager_.SetTextureCache(&textureCache_); framebufferManager_.SetShaderManager(shaderManager_); // Sanity check gstate if ((int *)&gstate.transferstart - (int *)&gstate != 0xEA) { ERROR_LOG(G3D, "gstate has drifted out of sync!"); } // Sanity check commandFlags table - no dupes please std::set<u8> dupeCheck; commandFlags_ = new u8[256]; memset(commandFlags_, 0, 256 * sizeof(bool)); for (size_t i = 0; i < ARRAY_SIZE(commandTable); i++) { u8 cmd = commandTable[i].cmd; if (dupeCheck.find(cmd) != dupeCheck.end()) { ERROR_LOG(G3D, "Command table Dupe: %02x (%i)", (int)cmd, (int)cmd); } else { dupeCheck.insert(cmd); } commandFlags_[cmd] |= commandTable[i].flags; } // Find commands missing from the table. for (int i = 0; i < 0xEF; i++) { if (dupeCheck.find((u8)i) == dupeCheck.end()) { ERROR_LOG(G3D, "Command missing from table: %02x (%i)", i, i); } } BuildReportingInfo(); }
GLES_GPU::GLES_GPU() : resized_(false) { lastVsync_ = g_Config.bVSync ? 1 : 0; if (gl_extensions.EXT_swap_control_tear) { // See http://developer.download.nvidia.com/opengl/specs/WGL_EXT_swap_control_tear.txt glstate.SetVSyncInterval(g_Config.bVSync ? -1 :0); } else { glstate.SetVSyncInterval(g_Config.bVSync ? 1 : 0); } #ifdef ANDROID if (gl_extensions.QCOM_binning_control) /* We can try different HINTS later or even with option to toggle for Adreno GPU CPU_OPTIMIZED_QCOM - binning algorithm focuses on lower CPU utilization (this path increases vertex processing GPU_OPTIMIZED_QCOM - binning algorithm focuses on lower GPU utilization (this path increases CPU usage RENDER_DIRECT_TO_FRAMEBUFFER_QCOM - render directly to the final framebuffer and bypass tile memory (this path has a low CPU usage, but in some cases uses more memory bandwidth) */ glHint(GL_BINNING_CONTROL_HINT_QCOM, GL_RENDER_DIRECT_TO_FRAMEBUFFER_QCOM); #endif shaderManager_ = new ShaderManager(); transformDraw_.SetShaderManager(shaderManager_); transformDraw_.SetTextureCache(&textureCache_); transformDraw_.SetFramebufferManager(&framebufferManager_); framebufferManager_.SetTextureCache(&textureCache_); framebufferManager_.SetShaderManager(shaderManager_); // Sanity check gstate if ((int *)&gstate.transferstart - (int *)&gstate != 0xEA) { ERROR_LOG(G3D, "gstate has drifted out of sync!"); } // Sanity check commandFlags table - no dupes please std::set<u8> dupeCheck; commandFlags_ = new u8[256]; memset(commandFlags_, 0, 256 * sizeof(bool)); for (size_t i = 0; i < ARRAY_SIZE(commandTable); i++) { u8 cmd = commandTable[i].cmd; if (dupeCheck.find(cmd) != dupeCheck.end()) { ERROR_LOG(G3D, "Command table Dupe: %02x (%i)", (int)cmd, (int)cmd); } else { dupeCheck.insert(cmd); } commandFlags_[cmd] |= commandTable[i].flags; } // Find commands missing from the table. for (int i = 0; i < 0xEF; i++) { if (dupeCheck.find((u8)i) == dupeCheck.end()) { ERROR_LOG(G3D, "Command missing from table: %02x (%i)", i, i); } } BuildReportingInfo(); }
GPU_Vulkan::GPU_Vulkan(GraphicsContext *gfxCtx, Draw::DrawContext *draw) : GPUCommon(gfxCtx, draw), vulkan_((VulkanContext *)gfxCtx->GetAPIContext()), drawEngine_(vulkan_, draw), depalShaderCache_(draw, vulkan_), vulkan2D_(vulkan_) { UpdateVsyncInterval(true); CheckGPUFeatures(); shaderManagerVulkan_ = new ShaderManagerVulkan(vulkan_); pipelineManager_ = new PipelineManagerVulkan(vulkan_); framebufferManagerVulkan_ = new FramebufferManagerVulkan(draw, vulkan_); framebufferManager_ = framebufferManagerVulkan_; textureCacheVulkan_ = new TextureCacheVulkan(draw, vulkan_); textureCache_ = textureCacheVulkan_; drawEngineCommon_ = &drawEngine_; shaderManager_ = shaderManagerVulkan_; drawEngine_.SetTextureCache(textureCacheVulkan_); drawEngine_.SetFramebufferManager(framebufferManagerVulkan_); drawEngine_.SetShaderManager(shaderManagerVulkan_); drawEngine_.SetPipelineManager(pipelineManager_); framebufferManagerVulkan_->SetVulkan2D(&vulkan2D_); framebufferManagerVulkan_->Init(); framebufferManagerVulkan_->SetTextureCache(textureCacheVulkan_); framebufferManagerVulkan_->SetDrawEngine(&drawEngine_); framebufferManagerVulkan_->SetShaderManager(shaderManagerVulkan_); textureCacheVulkan_->SetDepalShaderCache(&depalShaderCache_); textureCacheVulkan_->SetFramebufferManager(framebufferManagerVulkan_); textureCacheVulkan_->SetShaderManager(shaderManagerVulkan_); textureCacheVulkan_->SetDrawEngine(&drawEngine_); textureCacheVulkan_->SetVulkan2D(&vulkan2D_); InitDeviceObjects(); // Sanity check gstate if ((int *)&gstate.transferstart - (int *)&gstate != 0xEA) { ERROR_LOG(G3D, "gstate has drifted out of sync!"); } BuildReportingInfo(); // Update again after init to be sure of any silly driver problems. UpdateVsyncInterval(true); textureCacheVulkan_->NotifyConfigChanged(); if (vulkan_->GetFeaturesEnabled().wideLines) { drawEngine_.SetLineWidth(PSP_CoreParameter().renderWidth / 480.0f); } // Load shader cache. std::string discID = g_paramSFO.GetDiscID(); if (discID.size()) { File::CreateFullPath(GetSysDirectory(DIRECTORY_APP_CACHE)); shaderCachePath_ = GetSysDirectory(DIRECTORY_APP_CACHE) + "/" + discID + ".vkshadercache"; shaderCacheLoaded_ = false; std::thread th([&] { LoadCache(shaderCachePath_); shaderCacheLoaded_ = true; }); th.detach(); } }
GPU_Vulkan::GPU_Vulkan(GraphicsContext *gfxCtx, Draw::DrawContext *draw) : GPUCommon(gfxCtx, draw), vulkan_((VulkanContext *)gfxCtx->GetAPIContext()), drawEngine_(vulkan_) { UpdateVsyncInterval(true); CheckGPUFeatures(); shaderManagerVulkan_ = new ShaderManagerVulkan(vulkan_); pipelineManager_ = new PipelineManagerVulkan(vulkan_); framebufferManagerVulkan_ = new FramebufferManagerVulkan(draw, vulkan_); framebufferManager_ = framebufferManagerVulkan_; textureCacheVulkan_ = new TextureCacheVulkan(draw, vulkan_); textureCache_ = textureCacheVulkan_; drawEngineCommon_ = &drawEngine_; shaderManager_ = shaderManagerVulkan_; drawEngine_.SetTextureCache(textureCacheVulkan_); drawEngine_.SetFramebufferManager(framebufferManagerVulkan_); drawEngine_.SetShaderManager(shaderManagerVulkan_); drawEngine_.SetPipelineManager(pipelineManager_); framebufferManagerVulkan_->Init(); framebufferManagerVulkan_->SetTextureCache(textureCacheVulkan_); framebufferManagerVulkan_->SetDrawEngine(&drawEngine_); framebufferManagerVulkan_->SetShaderManager(shaderManagerVulkan_); textureCacheVulkan_->SetFramebufferManager(framebufferManagerVulkan_); textureCacheVulkan_->SetDepalShaderCache(&depalShaderCache_); textureCacheVulkan_->SetShaderManager(shaderManagerVulkan_); textureCacheVulkan_->SetDrawEngine(&drawEngine_); // Sanity check gstate if ((int *)&gstate.transferstart - (int *)&gstate != 0xEA) { ERROR_LOG(G3D, "gstate has drifted out of sync!"); } // Sanity check cmdInfo_ table - no dupes please std::set<u8> dupeCheck; memset(cmdInfo_, 0, sizeof(cmdInfo_)); for (size_t i = 0; i < ARRAY_SIZE(commandTable); i++) { const u8 cmd = commandTable[i].cmd; if (dupeCheck.find(cmd) != dupeCheck.end()) { ERROR_LOG(G3D, "Command table Dupe: %02x (%i)", (int)cmd, (int)cmd); } else { dupeCheck.insert(cmd); } cmdInfo_[cmd].flags |= (uint64_t)commandTable[i].flags | (commandTable[i].dirty << 8); cmdInfo_[cmd].func = commandTable[i].func; if ((cmdInfo_[cmd].flags & (FLAG_EXECUTE | FLAG_EXECUTEONCHANGE)) && !cmdInfo_[cmd].func) { Crash(); } } // Find commands missing from the table. for (int i = 0; i < 0xEF; i++) { if (dupeCheck.find((u8)i) == dupeCheck.end()) { ERROR_LOG(G3D, "Command missing from table: %02x (%i)", i, i); } } UpdateCmdInfo(); BuildReportingInfo(); // Update again after init to be sure of any silly driver problems. UpdateVsyncInterval(true); textureCacheVulkan_->NotifyConfigChanged(); }