Implement full occlusion queries for the Nexus 9.

GLES3 spec is worthless and only returns a boolean result for occlusion queries. This is fine for simple cellular games but we need more than a
boolean result.
Thankfully Nvidia exposes GL_NV_occlusion_queries under a OpenGL ES extension, which allows us to get full samples rendered.
The only device this change affects is the Nexus 9, since it is an Nvidia K1 crippled to only support OpenGL ES.
No other OpenGL ES device that I know of supports this extension.
This commit is contained in:
Ryan Houdek
2015-02-21 16:58:53 -06:00
parent a5b4ac6faa
commit e9ac4d53a6
3 changed files with 232 additions and 77 deletions

View File

@ -1,18 +1,20 @@
#pragma once
#include <array>
#include <memory>
#include "VideoBackends/OGL/GLExtensions/GLExtensions.h"
#include "VideoCommon/PerfQueryBase.h"
namespace OGL
{
PerfQueryBase* GetPerfQuery();
class PerfQuery : public PerfQueryBase
{
public:
PerfQuery();
~PerfQuery();
~PerfQuery() {}
void EnableQuery(PerfQueryGroup type) override;
void DisableQuery(PerfQueryGroup type) override;
@ -21,7 +23,7 @@ public:
void FlushResults() override;
bool IsFlushed() const override;
private:
protected:
struct ActiveQuery
{
GLuint query_id;
@ -31,10 +33,6 @@ private:
// when testing in SMS: 64 was too small, 128 was ok
static const u32 PERF_QUERY_BUFFER_SIZE = 512;
void WeakFlush();
// Only use when non-empty
void FlushOne();
// This contains gl query objects with unretrieved results.
std::array<ActiveQuery, PERF_QUERY_BUFFER_SIZE> m_query_buffer;
u32 m_query_read_pos;
@ -42,6 +40,48 @@ private:
// TODO: sloppy
volatile u32 m_query_count;
volatile u32 m_results[PQG_NUM_MEMBERS];
private:
// Implementation
std::unique_ptr<PerfQuery> m_query;
};
// Implementations
class PerfQueryGL : public PerfQuery
{
public:
PerfQueryGL(GLenum query_type);
~PerfQueryGL();
void EnableQuery(PerfQueryGroup type) override;
void DisableQuery(PerfQueryGroup type) override;
void FlushResults() override;
private:
void WeakFlush();
// Only use when non-empty
void FlushOne();
GLenum m_query_type;
};
class PerfQueryGLESNV : public PerfQuery
{
public:
PerfQueryGLESNV();
~PerfQueryGLESNV();
void EnableQuery(PerfQueryGroup type) override;
void DisableQuery(PerfQueryGroup type) override;
void FlushResults() override;
private:
void WeakFlush();
// Only use when non-empty
void FlushOne();
};
} // namespace