OcclusionQuery renamed to GpuQuery, and added query modes

Former-commit-id: b36a9b623653ac9b1eb422b09b3781ef46b81aca
This commit is contained in:
Lynix 2013-09-03 13:49:17 +02:00
parent 00fe872f27
commit 76abb5bf16
5 changed files with 72 additions and 16 deletions

View File

@ -51,6 +51,18 @@ enum nzFaceFilling
nzFaceFilling_Max = nzFaceFilling_Fill
};
enum nzGpuQueryMode
{
nzGpuQueryMode_AnySamplesPassed,
nzGpuQueryMode_AnySamplesPassedConservative,
nzGpuQueryMode_PrimitiveGenerated,
nzGpuQueryMode_SamplesPassed,
nzGpuQueryMode_TimeElapsed,
nzGpuQueryMode_TransformFeedbackPrimitivesWritten,
nzGpuQueryMode_Max = nzGpuQueryMode_TransformFeedbackPrimitivesWritten
};
enum nzMatrixType
{
// Matrices de base

View File

@ -4,29 +4,31 @@
#pragma once
#ifndef NAZARA_OCCLUSIONQUERY_HPP
#define NAZARA_OCCLUSIONQUERY_HPP
#ifndef NAZARA_GPUQUERY_HPP
#define NAZARA_GPUQUERY_HPP
#include <Nazara/Prerequesites.hpp>
#include <Nazara/Core/NonCopyable.hpp>
#include <Nazara/Renderer/Enums.hpp>
class NAZARA_API NzOcclusionQuery : NzNonCopyable
class NAZARA_API NzGpuQuery : NzNonCopyable
{
public:
NzOcclusionQuery();
~NzOcclusionQuery();
NzGpuQuery();
~NzGpuQuery();
void Begin();
void Begin(nzGpuQueryMode mode);
void End();
unsigned int GetResult() const;
bool IsResultAvailable() const;
static bool IsModeSupported(nzGpuQueryMode mode);
static bool IsSupported();
private:
unsigned int m_id;
};
#endif // NAZARA_OCCLUSIONQUERY_HPP
#endif // NAZARA_GPUQUERY_HPP

View File

@ -135,6 +135,7 @@ class NAZARA_API NzOpenGL
static GLenum FaceCulling[nzFaceCulling_Max+1];
static GLenum FaceFilling[nzFaceFilling_Max+1];
static GLenum PrimitiveMode[nzPrimitiveMode_Max+1];
static GLenum QueryMode[nzGpuQueryMode_Max+1];
static GLenum RendererComparison[nzRendererComparison_Max+1];
static GLenum RendererParameter[nzRendererParameter_Max+1];
static GLenum SamplerWrapMode[nzSamplerWrap_Max+1];

View File

@ -2,7 +2,7 @@
// This file is part of the "Nazara Engine - Renderer module"
// For conditions of distribution and use, see copyright notice in Config.hpp
#include <Nazara/Renderer/OcclusionQuery.hpp>
#include <Nazara/Renderer/GpuQuery.hpp>
#include <Nazara/Core/Error.hpp>
#include <Nazara/Renderer/Config.hpp>
#include <Nazara/Renderer/Context.hpp>
@ -11,7 +11,7 @@
#include <stdexcept>
#include <Nazara/Renderer/Debug.hpp>
NzOcclusionQuery::NzOcclusionQuery() :
NzGpuQuery::NzGpuQuery() :
m_id(0)
{
if (IsSupported())
@ -35,7 +35,7 @@ m_id(0)
#endif
}
NzOcclusionQuery::~NzOcclusionQuery()
NzGpuQuery::~NzGpuQuery()
{
if (m_id)
{
@ -46,7 +46,7 @@ NzOcclusionQuery::~NzOcclusionQuery()
}
}
void NzOcclusionQuery::Begin()
void NzGpuQuery::Begin(nzGpuQueryMode mode)
{
#ifdef NAZARA_DEBUG
if (NzContext::GetCurrent() == nullptr)
@ -56,10 +56,18 @@ void NzOcclusionQuery::Begin()
}
#endif
glBeginQuery(GL_SAMPLES_PASSED, m_id);
#if NAZARA_RENDERER_SAFE
if (!IsModeSupported(mode))
{
NazaraError("Mode (0x" + NzString::Number(mode, 16) + ") not supported");
return;
}
#endif
glBeginQuery(NzOpenGL::QueryMode[mode], m_id);
}
void NzOcclusionQuery::End()
void NzGpuQuery::End()
{
#ifdef NAZARA_DEBUG
if (NzContext::GetCurrent() == nullptr)
@ -72,7 +80,7 @@ void NzOcclusionQuery::End()
glEndQuery(GL_SAMPLES_PASSED);
}
unsigned int NzOcclusionQuery::GetResult() const
unsigned int NzGpuQuery::GetResult() const
{
NzContext::EnsureContext();
@ -82,7 +90,7 @@ unsigned int NzOcclusionQuery::GetResult() const
return result;
}
bool NzOcclusionQuery::IsResultAvailable() const
bool NzGpuQuery::IsResultAvailable() const
{
NzContext::EnsureContext();
@ -92,7 +100,28 @@ bool NzOcclusionQuery::IsResultAvailable() const
return available == GL_TRUE;
}
bool NzOcclusionQuery::IsSupported()
bool NzGpuQuery::IsModeSupported(nzGpuQueryMode mode)
{
switch (mode)
{
case nzGpuQueryMode_AnySamplesPassed:
case nzGpuQueryMode_TimeElapsed:
return NzOpenGL::GetVersion() >= 330;
case nzGpuQueryMode_AnySamplesPassedConservative:
return NzOpenGL::GetVersion() >= 430;
case nzGpuQueryMode_PrimitiveGenerated:
case nzGpuQueryMode_SamplesPassed:
case nzGpuQueryMode_TransformFeedbackPrimitivesWritten:
return true;
}
NazaraError("Gpu Query mode not handled (0x" + NzString::Number(mode, 16) + ')');
return false;
}
bool NzGpuQuery::IsSupported()
{
return NzRenderer::HasCapability(nzRendererCap_OcclusionQuery);
}

View File

@ -1707,6 +1707,18 @@ GLenum NzOpenGL::PrimitiveMode[nzPrimitiveMode_Max+1] =
static_assert(sizeof(NzOpenGL::PrimitiveMode)/sizeof(GLenum) == nzPrimitiveMode_Max+1, "Primitive mode array is incomplete");
GLenum NzOpenGL::QueryMode[nzGpuQueryMode_Max+1] =
{
GL_ANY_SAMPLES_PASSED, // nzGpuQueryMode_AnySamplesPassed
GL_ANY_SAMPLES_PASSED_CONSERVATIVE, // nzGpuQueryMode_AnySamplesPassedConservative
GL_PRIMITIVES_GENERATED, // nzGpuQueryMode_PrimitiveGenerated
GL_SAMPLES_PASSED, // nzGpuQueryMode_SamplesPassed
GL_TIME_ELAPSED, // nzGpuQueryMode_TimeElapsed
GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN // nzGpuQueryMode_TransformFeedbackPrimitivesWritten
};
static_assert(sizeof(NzOpenGL::QueryMode)/sizeof(GLenum) == nzGpuQueryMode_Max+1, "Query mode array is incomplete");
GLenum NzOpenGL::RendererComparison[nzRendererComparison_Max+1] =
{
GL_ALWAYS, // nzRendererComparison_Always