| #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 |