|
|
@ -51,6 +51,22 @@ constexpr size_t NUM_SUPPORTED_VERTEX_ATTRIBUTES = 16; |
|
|
void oglEnable(GLenum cap, bool state) { |
|
|
void oglEnable(GLenum cap, bool state) { |
|
|
(state ? glEnable : glDisable)(cap); |
|
|
(state ? glEnable : glDisable)(cap); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
std::optional<VideoCore::QueryType> MaxwellToVideoCoreQuery(VideoCommon::QueryType type) { |
|
|
|
|
|
switch (type) { |
|
|
|
|
|
case VideoCommon::QueryType::PrimitivesGenerated: |
|
|
|
|
|
case VideoCommon::QueryType::VtgPrimitivesOut: |
|
|
|
|
|
return VideoCore::QueryType::PrimitivesGenerated; |
|
|
|
|
|
case VideoCommon::QueryType::ZPassPixelCount64: |
|
|
|
|
|
return VideoCore::QueryType::SamplesPassed; |
|
|
|
|
|
case VideoCommon::QueryType::StreamingPrimitivesSucceeded: |
|
|
|
|
|
// case VideoCommon::QueryType::StreamingByteCount:
|
|
|
|
|
|
// TODO: StreamingByteCount = StreamingPrimitivesSucceeded * num_verts * vert_stride
|
|
|
|
|
|
return VideoCore::QueryType::TfbPrimitivesWritten; |
|
|
|
|
|
default: |
|
|
|
|
|
return std::nullopt; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
} // Anonymous namespace
|
|
|
} // Anonymous namespace
|
|
|
|
|
|
|
|
|
RasterizerOpenGL::RasterizerOpenGL(Core::Frontend::EmuWindow& emu_window_, Tegra::GPU& gpu_, |
|
|
RasterizerOpenGL::RasterizerOpenGL(Core::Frontend::EmuWindow& emu_window_, Tegra::GPU& gpu_, |
|
|
@ -216,7 +232,6 @@ void RasterizerOpenGL::PrepareDraw(bool is_indexed, Func&& draw_func) { |
|
|
|
|
|
|
|
|
SCOPE_EXIT({ gpu.TickWork(); }); |
|
|
SCOPE_EXIT({ gpu.TickWork(); }); |
|
|
gpu_memory->FlushCaching(); |
|
|
gpu_memory->FlushCaching(); |
|
|
query_cache.UpdateCounters(); |
|
|
|
|
|
|
|
|
|
|
|
GraphicsPipeline* const pipeline{shader_cache.CurrentGraphicsPipeline()}; |
|
|
GraphicsPipeline* const pipeline{shader_cache.CurrentGraphicsPipeline()}; |
|
|
if (!pipeline) { |
|
|
if (!pipeline) { |
|
|
@ -334,7 +349,6 @@ void RasterizerOpenGL::DrawTexture() { |
|
|
MICROPROFILE_SCOPE(OpenGL_Drawing); |
|
|
MICROPROFILE_SCOPE(OpenGL_Drawing); |
|
|
|
|
|
|
|
|
SCOPE_EXIT({ gpu.TickWork(); }); |
|
|
SCOPE_EXIT({ gpu.TickWork(); }); |
|
|
query_cache.UpdateCounters(); |
|
|
|
|
|
|
|
|
|
|
|
texture_cache.SynchronizeGraphicsDescriptors(); |
|
|
texture_cache.SynchronizeGraphicsDescriptors(); |
|
|
texture_cache.UpdateRenderTargets(false); |
|
|
texture_cache.UpdateRenderTargets(false); |
|
|
@ -401,21 +415,28 @@ void RasterizerOpenGL::DispatchCompute() { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void RasterizerOpenGL::ResetCounter(VideoCommon::QueryType type) { |
|
|
void RasterizerOpenGL::ResetCounter(VideoCommon::QueryType type) { |
|
|
if (type == VideoCommon::QueryType::ZPassPixelCount64) { |
|
|
|
|
|
query_cache.ResetCounter(VideoCore::QueryType::SamplesPassed); |
|
|
|
|
|
|
|
|
const auto query_cache_type = MaxwellToVideoCoreQuery(type); |
|
|
|
|
|
if (!query_cache_type.has_value()) { |
|
|
|
|
|
UNIMPLEMENTED_IF_MSG(type != VideoCommon::QueryType::Payload, "Reset query type: {}", type); |
|
|
|
|
|
return; |
|
|
} |
|
|
} |
|
|
|
|
|
query_cache.ResetCounter(*query_cache_type); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void RasterizerOpenGL::Query(GPUVAddr gpu_addr, VideoCommon::QueryType type, |
|
|
void RasterizerOpenGL::Query(GPUVAddr gpu_addr, VideoCommon::QueryType type, |
|
|
VideoCommon::QueryPropertiesFlags flags, u32 payload, u32 subreport) { |
|
|
VideoCommon::QueryPropertiesFlags flags, u32 payload, u32 subreport) { |
|
|
if (type == VideoCommon::QueryType::ZPassPixelCount64) { |
|
|
|
|
|
if (True(flags & VideoCommon::QueryPropertiesFlags::HasTimeout)) { |
|
|
|
|
|
query_cache.Query(gpu_addr, VideoCore::QueryType::SamplesPassed, {gpu.GetTicks()}); |
|
|
|
|
|
} else { |
|
|
|
|
|
query_cache.Query(gpu_addr, VideoCore::QueryType::SamplesPassed, std::nullopt); |
|
|
|
|
|
} |
|
|
|
|
|
return; |
|
|
|
|
|
|
|
|
const auto query_cache_type = MaxwellToVideoCoreQuery(type); |
|
|
|
|
|
if (!query_cache_type.has_value()) { |
|
|
|
|
|
return QueryFallback(gpu_addr, type, flags, payload, subreport); |
|
|
} |
|
|
} |
|
|
|
|
|
const bool has_timeout = True(flags & VideoCommon::QueryPropertiesFlags::HasTimeout); |
|
|
|
|
|
const auto timestamp = has_timeout ? std::optional<u64>{gpu.GetTicks()} : std::nullopt; |
|
|
|
|
|
query_cache.Query(gpu_addr, *query_cache_type, timestamp); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void RasterizerOpenGL::QueryFallback(GPUVAddr gpu_addr, VideoCommon::QueryType type, |
|
|
|
|
|
VideoCommon::QueryPropertiesFlags flags, u32 payload, |
|
|
|
|
|
u32 subreport) { |
|
|
if (type != VideoCommon::QueryType::Payload) { |
|
|
if (type != VideoCommon::QueryType::Payload) { |
|
|
payload = 1u; |
|
|
payload = 1u; |
|
|
} |
|
|
} |
|
|
|