| #ifndef _RRSHADERS_HPP |
| #define _RRSHADERS_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 Shader interfaces. |
| *//*--------------------------------------------------------------------*/ |
| |
| #include "rrDefs.hpp" |
| #include "rrVertexAttrib.hpp" |
| #include "rrVertexPacket.hpp" |
| #include "rrFragmentPacket.hpp" |
| #include "rrPrimitivePacket.hpp" |
| #include "rrShadingContext.hpp" |
| #include "deString.h" |
| |
| namespace rr |
| { |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief Vertex shader input information |
| *//*--------------------------------------------------------------------*/ |
| struct VertexInputInfo |
| { |
| VertexInputInfo (void) |
| { |
| // sensible defaults |
| type = GENERICVECTYPE_LAST; |
| } |
| |
| GenericVecType type; |
| }; |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief Shader varying information |
| *//*--------------------------------------------------------------------*/ |
| struct VertexVaryingInfo |
| { |
| VertexVaryingInfo (void) |
| { |
| // sensible defaults |
| type = GENERICVECTYPE_LAST; |
| flatshade = false; |
| } |
| |
| // \note used by std::vector<T>::operator==() const |
| bool operator== (const VertexVaryingInfo& other) const |
| { |
| return type == other.type && |
| flatshade == other.flatshade; |
| } |
| |
| GenericVecType type; |
| bool flatshade; |
| }; |
| |
| typedef VertexVaryingInfo VertexOutputInfo; |
| typedef VertexVaryingInfo FragmentInputInfo; |
| typedef VertexVaryingInfo GeometryInputInfo; |
| typedef VertexVaryingInfo GeometryOutputInfo; |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief Fragment shader output information |
| *//*--------------------------------------------------------------------*/ |
| struct FragmentOutputInfo |
| { |
| FragmentOutputInfo (void) |
| { |
| // sensible defaults |
| type = GENERICVECTYPE_LAST; |
| } |
| |
| GenericVecType type; |
| }; |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief Vertex shader interface |
| * |
| * Vertex shaders execute shading for set of vertex packets. See VertexPacket |
| * documentation for more details on shading API. |
| *//*--------------------------------------------------------------------*/ |
| class VertexShader |
| { |
| public: |
| VertexShader (size_t numInputs, size_t numOutputs) : m_inputs(numInputs), m_outputs(numOutputs) {} |
| |
| virtual void shadeVertices (const VertexAttrib* inputs, VertexPacket* const* packets, const int numPackets) const = 0; |
| |
| const std::vector<VertexInputInfo>& getInputs (void) const { return m_inputs; } |
| const std::vector<VertexOutputInfo>& getOutputs (void) const { return m_outputs; } |
| |
| protected: |
| ~VertexShader (void) {}; // \note Renderer will not delete any objects passed in. |
| |
| std::vector<VertexInputInfo> m_inputs; |
| std::vector<VertexOutputInfo> m_outputs; |
| } DE_WARN_UNUSED_TYPE; |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief Fragment shader interface |
| * |
| * Fragment shader executes shading for list of fragment packets. See |
| * FragmentPacket documentation for more details on shading API. |
| *//*--------------------------------------------------------------------*/ |
| class FragmentShader |
| { |
| public: |
| FragmentShader (size_t numInputs, size_t numOutputs) : m_inputs(numInputs), m_outputs(numOutputs) {} |
| |
| const std::vector<FragmentInputInfo>& getInputs (void) const { return m_inputs; } |
| const std::vector<FragmentOutputInfo>& getOutputs (void) const { return m_outputs; } |
| |
| virtual void shadeFragments (FragmentPacket* packets, const int numPackets, const FragmentShadingContext& context) const = 0; // \note numPackets must be greater than zero. |
| |
| protected: |
| ~FragmentShader (void) {}; // \note Renderer will not delete any objects passed in. |
| |
| std::vector<FragmentInputInfo> m_inputs; |
| std::vector<FragmentOutputInfo> m_outputs; |
| } DE_WARN_UNUSED_TYPE; |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief Geometry shader input primitive type |
| *//*--------------------------------------------------------------------*/ |
| enum GeometryShaderInputType |
| { |
| GEOMETRYSHADERINPUTTYPE_POINTS = 0, |
| GEOMETRYSHADERINPUTTYPE_LINES, |
| GEOMETRYSHADERINPUTTYPE_LINES_ADJACENCY, |
| GEOMETRYSHADERINPUTTYPE_TRIANGLES, |
| GEOMETRYSHADERINPUTTYPE_TRIANGLES_ADJACENCY, |
| |
| GEOMETRYSHADERINPUTTYPE_LAST |
| }; |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief Geometry shader output primitive type |
| *//*--------------------------------------------------------------------*/ |
| enum GeometryShaderOutputType |
| { |
| GEOMETRYSHADEROUTPUTTYPE_POINTS = 0, |
| GEOMETRYSHADEROUTPUTTYPE_LINE_STRIP, |
| GEOMETRYSHADEROUTPUTTYPE_TRIANGLE_STRIP, |
| |
| GEOMETRYSHADEROUTPUTTYPE_LAST |
| }; |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief Geometry shader interface |
| * |
| * Geometry shader executes a list of primitive packets and outputs |
| * a new set of vertex packets for new primitives. |
| *//*--------------------------------------------------------------------*/ |
| class GeometryShader |
| { |
| public: |
| GeometryShader (size_t numVaryingInputs, |
| size_t numVaryingOutputs, |
| GeometryShaderInputType inputType, |
| GeometryShaderOutputType outputType, |
| size_t numVerticesOut, |
| size_t numInvocations); |
| |
| virtual void shadePrimitives (GeometryEmitter& output, int verticesIn, const PrimitivePacket* packets, const int numPackets, int invocationID) const = 0; |
| |
| const std::vector<GeometryInputInfo>& getInputs (void) const { return m_inputs; } |
| const std::vector<GeometryOutputInfo>& getOutputs (void) const { return m_outputs; } |
| inline GeometryShaderInputType getInputType (void) const { return m_inputType; } |
| inline GeometryShaderOutputType getOutputType (void) const { return m_outputType; } |
| inline size_t getNumVerticesOut (void) const { return m_numVerticesOut; } |
| inline size_t getNumInvocations (void) const { return m_numInvocations; } |
| |
| protected: |
| const GeometryShaderInputType m_inputType; |
| const GeometryShaderOutputType m_outputType; |
| const size_t m_numVerticesOut; |
| const size_t m_numInvocations; |
| |
| std::vector<GeometryInputInfo> m_inputs; |
| std::vector<GeometryOutputInfo> m_outputs; |
| } DE_WARN_UNUSED_TYPE; |
| |
| // Helpers for shader implementations. |
| |
| template<class Shader> |
| class VertexShaderLoop : public VertexShader |
| { |
| public: |
| VertexShaderLoop (const Shader& shader) : m_shader(shader) {} |
| |
| void shadeVertices (const VertexAttrib* inputs, VertexPacket* packets, const int numPackets) const; |
| |
| private: |
| const Shader& m_shader; |
| }; |
| |
| template<class Shader> |
| void VertexShaderLoop<Shader>::shadeVertices (const VertexAttrib* inputs, VertexPacket* packets, const int numPackets) const |
| { |
| for (int ndx = 0; ndx < numPackets; ndx++) |
| m_shader.shadeVertex(inputs, packets[ndx]); |
| } |
| |
| template<class Shader> |
| class FragmentShaderLoop : public FragmentShader |
| { |
| public: |
| FragmentShaderLoop (const Shader& shader) : m_shader(shader) {} |
| |
| void shadeFragments (FragmentPacket* packets, const int numPackets) const; |
| |
| private: |
| const Shader& m_shader; |
| }; |
| |
| template<class Shader> |
| void FragmentShaderLoop<Shader>::shadeFragments (FragmentPacket* packets, const int numPackets) const |
| { |
| for (int ndx = 0; ndx < numPackets; ndx++) |
| m_shader.shadeFragment(packets[ndx]); |
| } |
| |
| } // rr |
| |
| #endif // _RRSHADERS_HPP |