| #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 uint32_t *, int baseVertex = 0); |
| DrawIndices(const uint16_t *, int baseVertex = 0); |
| DrawIndices(const uint8_t *, 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, uint32_t 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; |
| |
| } // namespace rr |
| |
| #endif // _RRRENDERER_HPP |