You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
145 lines
4.8 KiB
145 lines
4.8 KiB
#ifndef _RRRENDERER_HPP
|
|
#define _RRRENDERER_HPP
|
|
/*-------------------------------------------------------------------------
|
|
* drawElements Quality Program Reference Renderer
|
|
* -----------------------------------------------
|
|
*
|
|
* Copyright 2014 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*
|
|
*//*!
|
|
* \file
|
|
* \brief Reference renderer interface.
|
|
*//*--------------------------------------------------------------------*/
|
|
|
|
#include "rrDefs.hpp"
|
|
#include "rrShaders.hpp"
|
|
#include "rrRenderState.hpp"
|
|
#include "rrPrimitiveTypes.hpp"
|
|
#include "rrMultisamplePixelBufferAccess.hpp"
|
|
#include "tcuTexture.hpp"
|
|
|
|
namespace rr
|
|
{
|
|
|
|
class RenderTarget
|
|
{
|
|
public:
|
|
enum
|
|
{
|
|
MAX_COLOR_BUFFERS = 4
|
|
};
|
|
|
|
RenderTarget (const MultisamplePixelBufferAccess& colorMultisampleBuffer,
|
|
const MultisamplePixelBufferAccess& depthMultisampleBuffer = MultisamplePixelBufferAccess(),
|
|
const MultisamplePixelBufferAccess& stencilMultisampleBuffer = MultisamplePixelBufferAccess());
|
|
|
|
int getNumSamples (void) const;
|
|
|
|
const MultisamplePixelBufferAccess& getColorBuffer (int ndx) const { DE_ASSERT(de::inRange(ndx, 0, m_numColorBuffers)); return m_colorBuffers[ndx]; }
|
|
int getNumColorBuffers (void) const { return m_numColorBuffers; }
|
|
const MultisamplePixelBufferAccess& getStencilBuffer (void) const { return m_stencilBuffer; }
|
|
const MultisamplePixelBufferAccess& getDepthBuffer (void) const { return m_depthBuffer; }
|
|
|
|
private:
|
|
MultisamplePixelBufferAccess m_colorBuffers[MAX_COLOR_BUFFERS];
|
|
const int m_numColorBuffers;
|
|
const MultisamplePixelBufferAccess m_depthBuffer;
|
|
const MultisamplePixelBufferAccess m_stencilBuffer;
|
|
} DE_WARN_UNUSED_TYPE;
|
|
|
|
struct Program
|
|
{
|
|
Program (const VertexShader* vertexShader_, const FragmentShader* fragmentShader_, const GeometryShader* geometryShader_ = DE_NULL)
|
|
: vertexShader (vertexShader_)
|
|
, fragmentShader (fragmentShader_)
|
|
, geometryShader (geometryShader_)
|
|
{
|
|
}
|
|
|
|
const VertexShader* vertexShader;
|
|
const FragmentShader* fragmentShader;
|
|
const GeometryShader* geometryShader;
|
|
} DE_WARN_UNUSED_TYPE;
|
|
|
|
struct DrawIndices
|
|
{
|
|
DrawIndices (const deUint32*, int baseVertex = 0);
|
|
DrawIndices (const deUint16*, int baseVertex = 0);
|
|
DrawIndices (const deUint8*, int baseVertex = 0);
|
|
DrawIndices (const void* ptr, IndexType type, int baseVertex = 0);
|
|
|
|
const void* const indices;
|
|
const IndexType indexType;
|
|
const int baseVertex;
|
|
} DE_WARN_UNUSED_TYPE;
|
|
|
|
class PrimitiveList
|
|
{
|
|
public:
|
|
PrimitiveList (PrimitiveType primitiveType, int numElements, const int firstElement); // !< primitive list for drawArrays-like call
|
|
PrimitiveList (PrimitiveType primitiveType, int numElements, const DrawIndices& indices); // !< primitive list for drawElements-like call
|
|
|
|
size_t getIndex (size_t elementNdx) const;
|
|
bool isRestartIndex (size_t elementNdx, deUint32 restartIndex) const;
|
|
|
|
inline size_t getNumElements (void) const { return m_numElements; }
|
|
inline PrimitiveType getPrimitiveType (void) const { return m_primitiveType; }
|
|
inline IndexType getIndexType (void) const { return m_indexType; }
|
|
|
|
private:
|
|
const PrimitiveType m_primitiveType;
|
|
const size_t m_numElements;
|
|
const void* const m_indices; // !< if indices is NULL, indices is interpreted as [first (== baseVertex) + 0, first + 1, first + 2, ...]
|
|
const IndexType m_indexType;
|
|
const int m_baseVertex;
|
|
};
|
|
|
|
class DrawCommand
|
|
{
|
|
public:
|
|
DrawCommand (const RenderState& state_, const RenderTarget& renderTarget_, const Program& program_, int numVertexAttribs_, const VertexAttrib* vertexAttribs_, const PrimitiveList& primitives_)
|
|
: state (state_)
|
|
, renderTarget (renderTarget_)
|
|
, program (program_)
|
|
, numVertexAttribs (numVertexAttribs_)
|
|
, vertexAttribs (vertexAttribs_)
|
|
, primitives (primitives_)
|
|
{
|
|
}
|
|
|
|
const RenderState& state;
|
|
const RenderTarget& renderTarget;
|
|
const Program& program;
|
|
|
|
const int numVertexAttribs;
|
|
const VertexAttrib* const vertexAttribs;
|
|
|
|
const PrimitiveList& primitives;
|
|
} DE_WARN_UNUSED_TYPE;
|
|
|
|
class Renderer
|
|
{
|
|
public:
|
|
Renderer (void);
|
|
~Renderer (void);
|
|
|
|
void draw (const DrawCommand& command) const;
|
|
void drawInstanced (const DrawCommand& command, int numInstances) const;
|
|
} DE_WARN_UNUSED_TYPE;
|
|
|
|
} // rr
|
|
|
|
#endif // _RRRENDERER_HPP
|