Compare commits
3 Commits
liz-no-rtt
...
smartquery
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c15a08620c | ||
|
|
c692c3f7b0 | ||
|
|
51392bacc2 |
1
externals/ffmpeg/CMakeLists.txt
vendored
1
externals/ffmpeg/CMakeLists.txt
vendored
@@ -217,6 +217,7 @@ else()
|
||||
--disable-ffmpeg
|
||||
--disable-ffprobe
|
||||
--disable-network
|
||||
--disable-postproc
|
||||
--disable-swresample
|
||||
--enable-decoder=h264
|
||||
--enable-decoder=vp8
|
||||
|
||||
@@ -87,10 +87,6 @@ if (MSVC AND NOT CXX_CLANG)
|
||||
/wd4324 # 'struct_name': structure was padded due to __declspec(align())
|
||||
/wd4201 # nonstandard extension used : nameless struct/union
|
||||
/wd4702 # unreachable code (when used with LTO)
|
||||
|
||||
$<$<CONFIG:Release>:/GS-> # No stack buffer overflow checks
|
||||
/Gy # Enable function level linking
|
||||
/GR- # Disable run time type information
|
||||
)
|
||||
|
||||
if (NOT CXX_CLANG)
|
||||
@@ -105,14 +101,15 @@ if (MSVC AND NOT CXX_CLANG)
|
||||
add_compile_options(/QIntel-jcc-erratum)
|
||||
endif()
|
||||
|
||||
# /GS- - No stack buffer overflow checks
|
||||
add_compile_options("$<$<CONFIG:Release>:/GS->")
|
||||
|
||||
set(CMAKE_EXE_LINKER_FLAGS_DEBUG "/DEBUG /MANIFEST:NO" CACHE STRING "" FORCE)
|
||||
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/DEBUG /MANIFEST:NO /INCREMENTAL:NO /OPT:REF,ICF" CACHE STRING "" FORCE)
|
||||
else()
|
||||
if (NOT MSVC)
|
||||
add_compile_options(
|
||||
-fwrapv
|
||||
-fno-rtti # Disable RTTI
|
||||
-pipe
|
||||
)
|
||||
endif()
|
||||
|
||||
|
||||
@@ -161,7 +161,7 @@ public:
|
||||
/**
|
||||
* @returns A unique identifier for the Setting's internal data type.
|
||||
*/
|
||||
[[nodiscard]] virtual std::string_view TypeId() const = 0;
|
||||
[[nodiscard]] virtual std::type_index TypeId() const = 0;
|
||||
|
||||
/**
|
||||
* Returns true if the Setting's internal data type is an enum.
|
||||
|
||||
@@ -220,14 +220,8 @@ public:
|
||||
*
|
||||
* @returns the type_index of the setting's type
|
||||
*/
|
||||
[[nodiscard]] std::string_view TypeId() const override final {
|
||||
if constexpr (std::is_same_v<Type, std::string>) {
|
||||
return "string";
|
||||
} else if constexpr (std::is_same_v<Type, bool>) {
|
||||
return "bool";
|
||||
} else {
|
||||
return "other";
|
||||
}
|
||||
[[nodiscard]] std::type_index TypeId() const override final {
|
||||
return std::type_index(typeid(Type));
|
||||
}
|
||||
|
||||
[[nodiscard]] constexpr u32 EnumIndex() const override final {
|
||||
|
||||
@@ -444,9 +444,9 @@ void CmifReplyWrapImpl(HLERequestContext& ctx, T& t, Result (T::*f)(A...)) {
|
||||
const bool _is_domain = _mgr ? _mgr->IsDomain() : false;
|
||||
ASSERT_MSG(!_is_domain,
|
||||
"Non-domain reply used on domain session\n"
|
||||
"Service={} (TIPC={} CmdType={} Cmd=0x{:08X}\n"
|
||||
"Service={} (type={})\nTIPC={} CmdType={} Cmd=0x{:08X}\n"
|
||||
"HasDomainHeader={} DomainHandlers={}\nDesc={}",
|
||||
t.GetServiceName(), ctx.IsTipc(),
|
||||
t.GetServiceName(), typeid(T).name(), ctx.IsTipc(),
|
||||
static_cast<u32>(ctx.GetCommandType()), static_cast<u32>(ctx.GetCommand()),
|
||||
ctx.HasDomainMessageHeader(), _mgr ? static_cast<u32>(_mgr->DomainHandlerCount()) : 0u,
|
||||
ctx.Description());
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
#include "video_core/query_cache/query_cache_base.h"
|
||||
#include "video_core/query_cache/query_stream.h"
|
||||
#include "video_core/query_cache/types.h"
|
||||
|
||||
namespace Vulkan { class Scheduler; }
|
||||
namespace VideoCommon {
|
||||
|
||||
using Maxwell = Tegra::Engines::Maxwell3D;
|
||||
@@ -222,6 +222,12 @@ void QueryCacheBase<Traits>::CounterReset(QueryType counter_type) {
|
||||
streamer->ResetCounter();
|
||||
}
|
||||
|
||||
// Called at frame start to batch vkCmdResetQueryPool outside render passes.
|
||||
template <typename Traits>
|
||||
void QueryCacheBase<Traits>::FramePrologueResets(Vulkan::Scheduler& scheduler) {
|
||||
impl->runtime.FramePrologueResets(scheduler);
|
||||
}
|
||||
|
||||
template <typename Traits>
|
||||
void QueryCacheBase<Traits>::BindToChannel(s32 id) {
|
||||
VideoCommon::ChannelSetupCaches<VideoCommon::ChannelInfo>::BindToChannel(id);
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
@@ -21,7 +24,9 @@
|
||||
namespace VideoCore {
|
||||
class RasterizerInterface;
|
||||
}
|
||||
|
||||
namespace Vulkan {
|
||||
class Scheduler;
|
||||
}
|
||||
namespace Tegra {
|
||||
class GPU;
|
||||
}
|
||||
@@ -53,7 +58,7 @@ public:
|
||||
RuntimeType& runtime_);
|
||||
|
||||
~QueryCacheBase();
|
||||
|
||||
void FramePrologueResets(Vulkan::Scheduler& scheduler);
|
||||
void InvalidateRegion(VAddr addr, std::size_t size) {
|
||||
IterateCache<true>(addr, size,
|
||||
[this](QueryLocation location) { InvalidateQuery(location); });
|
||||
|
||||
@@ -156,7 +156,7 @@ public:
|
||||
|
||||
ReserveHostQuery();
|
||||
|
||||
// Ensure outside render pass
|
||||
/* Ensure outside render pass
|
||||
scheduler.RequestOutsideRenderPassOperationContext();
|
||||
|
||||
// Reset query pool outside render pass
|
||||
@@ -167,7 +167,7 @@ public:
|
||||
|
||||
// Manually restart the render pass (required for vkCmdClearAttachments, etc.)
|
||||
scheduler.RequestRenderpass(texture_cache.GetFramebuffer());
|
||||
|
||||
*/
|
||||
// Begin query inside the newly started render pass
|
||||
scheduler.Record([query_pool = current_query_pool,
|
||||
query_index = current_bank_slot](vk::CommandBuffer cmdbuf) {
|
||||
@@ -402,6 +402,13 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
VkQueryPool GetOrCreateCurrentPoolForPrologue() {
|
||||
if (!current_bank || current_bank->IsClosed()) {
|
||||
ReserveBank();
|
||||
}
|
||||
return current_query_pool;
|
||||
}
|
||||
|
||||
private:
|
||||
template <typename Func>
|
||||
void ApplyBankOp(VideoCommon::HostQueryBase* query, Func&& func) {
|
||||
@@ -1305,6 +1312,19 @@ void QueryCacheRuntime::ResumeHostConditionalRendering() {
|
||||
impl->is_hcr_running = true;
|
||||
}
|
||||
|
||||
void QueryCacheRuntime::FramePrologueResets(Scheduler& scheduler) {
|
||||
// Reset the occlusion queries we plan to use this frame in one go.
|
||||
// Ensure this is recorded OUTSIDE any render pass.
|
||||
const VkQueryPool pool = impl->sample_streamer.GetOrCreateCurrentPoolForPrologue();
|
||||
scheduler.RequestOutsideRenderPassOperationContext();
|
||||
scheduler.Record([pool](vk::CommandBuffer cmdbuf) {
|
||||
// Reset the whole bank so subsequent BeginQuery calls don't need per-slot resets.
|
||||
cmdbuf.ResetQueryPool(pool,
|
||||
/*first*/ 0,
|
||||
/*count*/ SamplesQueryBank::BANK_SIZE);
|
||||
});
|
||||
}
|
||||
|
||||
void QueryCacheRuntime::HostConditionalRenderingCompareValueImpl(VideoCommon::LookupData object,
|
||||
bool is_equal) {
|
||||
{
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
@@ -20,7 +23,7 @@ namespace Vulkan {
|
||||
class Device;
|
||||
class Scheduler;
|
||||
class StagingBufferPool;
|
||||
|
||||
class Scheduler;
|
||||
struct QueryCacheRuntimeImpl;
|
||||
|
||||
class QueryCacheRuntime {
|
||||
@@ -33,7 +36,7 @@ public:
|
||||
ComputePassDescriptorQueue& compute_pass_descriptor_queue,
|
||||
DescriptorPool& descriptor_pool, TextureCache& texture_cache_);
|
||||
~QueryCacheRuntime();
|
||||
|
||||
void FramePrologueResets(Scheduler& scheduler);
|
||||
template <typename SyncValuesType>
|
||||
void SyncValues(std::span<SyncValuesType> values, VkBuffer base_src_buffer = nullptr);
|
||||
|
||||
|
||||
@@ -257,6 +257,11 @@ u64 Scheduler::SubmitExecution(VkSemaphore signal_semaphore, VkSemaphore wait_se
|
||||
|
||||
void Scheduler::AllocateNewContext() {
|
||||
// Enable counters once again. These are disabled when a command buffer is finished.
|
||||
// Record per frame query resets outside any render pass, before the first draw.
|
||||
if (query_cache) {
|
||||
query_cache->FramePrologueResets(*this);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void Scheduler::InvalidateState() {
|
||||
|
||||
@@ -515,9 +515,9 @@ void Widget::SetupComponent(const QString& label, std::function<void()>& load_fu
|
||||
}
|
||||
|
||||
const bool require_checkbox =
|
||||
other_setting != nullptr && other_setting->ToString() == "bool";
|
||||
other_setting != nullptr && other_setting->TypeId() == typeid(bool);
|
||||
|
||||
if (other_setting != nullptr && other_setting->TypeId() != "bool") {
|
||||
if (other_setting != nullptr && other_setting->TypeId() != typeid(bool)) {
|
||||
LOG_WARNING(
|
||||
Frontend,
|
||||
"Extra setting \"{}\" specified but is not bool, refusing to create checkbox for it.",
|
||||
@@ -575,12 +575,12 @@ void Widget::SetupComponent(const QString& label, std::function<void()>& load_fu
|
||||
QWidget* lhs =
|
||||
CreateCheckBox(other_setting, label, checkbox_serializer, checkbox_restore_func, touch);
|
||||
layout->addWidget(lhs, 1);
|
||||
} else if (setting.TypeId() != "bool") {
|
||||
} else if (setting.TypeId() != typeid(bool)) {
|
||||
QLabel* qt_label = CreateLabel(label);
|
||||
layout->addWidget(qt_label, 1);
|
||||
}
|
||||
|
||||
if (setting.TypeId() == "bool") {
|
||||
if (setting.TypeId() == typeid(bool)) {
|
||||
data_component = CreateCheckBox(&setting, label, serializer, restore_func, touch);
|
||||
} else if (setting.IsEnum()) {
|
||||
if (request == RequestType::RadioGroup) {
|
||||
@@ -629,7 +629,7 @@ void Widget::SetupComponent(const QString& label, std::function<void()>& load_fu
|
||||
default:
|
||||
UNIMPLEMENTED();
|
||||
}
|
||||
} else if (type == "string") {
|
||||
} else if (type == typeid(std::string)) {
|
||||
switch (request) {
|
||||
case RequestType::Default:
|
||||
case RequestType::LineEdit:
|
||||
|
||||
Reference in New Issue
Block a user