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.
158 lines
7.5 KiB
158 lines
7.5 KiB
#ifndef _RRFRAGMENTOPERATIONS_HPP
|
|
#define _RRFRAGMENTOPERATIONS_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 implementation for per-fragment operations.
|
|
*
|
|
* \note In this file, a multisample buffer means a tcu::PixelBufferAccess
|
|
* (or ConstPixelBufferAccess) where the x coordinate is the sample
|
|
* index and the y and z coordinates are the pixel's x and y
|
|
* coordinates, respectively. To prevent supplying a buffer in
|
|
* a wrong format the buffers are wrapped in rr::MultisamplePixelBufferAccess
|
|
* wrapper. FragmentProcessor::render() operates on
|
|
* this kind of buffers. The function fromSinglesampleAccess() can be
|
|
* used to get a one-sampled multisample access to a normal 2d
|
|
* buffer.
|
|
*//*--------------------------------------------------------------------*/
|
|
|
|
#include "rrDefs.hpp"
|
|
#include "tcuVector.hpp"
|
|
#include "tcuTexture.hpp"
|
|
#include "rrRenderState.hpp"
|
|
#include "rrGenericVector.hpp"
|
|
#include "rrMultisamplePixelBufferAccess.hpp"
|
|
|
|
namespace rr
|
|
{
|
|
|
|
struct Fragment
|
|
{
|
|
tcu::IVec2 pixelCoord;
|
|
GenericVec4 value;
|
|
GenericVec4 value1;
|
|
deUint32 coverage;
|
|
const float* sampleDepths;
|
|
|
|
Fragment (const tcu::IVec2& pixelCoord_, const GenericVec4& value_, deUint32 coverage_, const float* sampleDepths_)
|
|
: pixelCoord (pixelCoord_)
|
|
, value (value_)
|
|
, value1 ()
|
|
, coverage (coverage_)
|
|
, sampleDepths (sampleDepths_)
|
|
{
|
|
}
|
|
|
|
Fragment (const tcu::IVec2& pixelCoord_, const GenericVec4& value_, const GenericVec4& value1_, deUint32 coverage_, const float* sampleDepths_)
|
|
: pixelCoord (pixelCoord_)
|
|
, value (value_)
|
|
, value1 (value1_)
|
|
, coverage (coverage_)
|
|
, sampleDepths (sampleDepths_)
|
|
{
|
|
}
|
|
|
|
Fragment (void)
|
|
: pixelCoord (0)
|
|
, value ()
|
|
, coverage (0)
|
|
, sampleDepths (DE_NULL)
|
|
{
|
|
}
|
|
} DE_WARN_UNUSED_TYPE;
|
|
|
|
// These functions are for clearing only a specific pixel rectangle in a multisample buffer.
|
|
// When clearing the entire buffer, tcu::clear, tcu::clearDepth and tcu::clearStencil can be used.
|
|
void clearMultisampleColorBuffer (const tcu::PixelBufferAccess& dst, const tcu::Vec4& value, const WindowRectangle& rect);
|
|
void clearMultisampleColorBuffer (const tcu::PixelBufferAccess& dst, const tcu::IVec4& value, const WindowRectangle& rect);
|
|
void clearMultisampleColorBuffer (const tcu::PixelBufferAccess& dst, const tcu::UVec4& value, const WindowRectangle& rect);
|
|
void clearMultisampleDepthBuffer (const tcu::PixelBufferAccess& dst, float value, const WindowRectangle& rect);
|
|
void clearMultisampleStencilBuffer (const tcu::PixelBufferAccess& dst, int value, const WindowRectangle& rect);
|
|
|
|
/*--------------------------------------------------------------------*//*!
|
|
* \brief Reference fragment renderer.
|
|
*
|
|
* FragmentProcessor.render() draws a given set of fragments. No two
|
|
* fragments given in one render() call should have the same pixel
|
|
* coordinates coordinates, and they must all have the same facing.
|
|
*//*--------------------------------------------------------------------*/
|
|
class FragmentProcessor
|
|
{
|
|
public:
|
|
FragmentProcessor (void);
|
|
|
|
void render (const rr::MultisamplePixelBufferAccess& colorMultisampleBuffer,
|
|
const rr::MultisamplePixelBufferAccess& depthMultisampleBuffer,
|
|
const rr::MultisamplePixelBufferAccess& stencilMultisampleBuffer,
|
|
const Fragment* fragments,
|
|
int numFragments,
|
|
FaceType fragmentFacing,
|
|
const FragmentOperationState& state);
|
|
|
|
private:
|
|
enum
|
|
{
|
|
SAMPLE_REGISTER_SIZE = 64
|
|
};
|
|
struct SampleData
|
|
{
|
|
bool isAlive;
|
|
bool stencilPassed;
|
|
bool depthPassed;
|
|
tcu::Vec4 clampedBlendSrcColor;
|
|
tcu::Vec4 clampedBlendSrc1Color;
|
|
tcu::Vec4 clampedBlendDstColor;
|
|
tcu::Vec3 blendSrcFactorRGB;
|
|
float blendSrcFactorA;
|
|
tcu::Vec3 blendDstFactorRGB;
|
|
float blendDstFactorA;
|
|
tcu::Vec3 blendedRGB;
|
|
float blendedA;
|
|
tcu::Vector<deInt32, 4> signedValue; //!< integer targets
|
|
tcu::Vector<deUint32, 4> unsignedValue; //!< unsigned integer targets
|
|
};
|
|
|
|
// These functions operate on the values in m_sampleRegister and, in some cases, the buffers.
|
|
|
|
void executeScissorTest (int fragNdxOffset, int numSamplesPerFragment, const Fragment* inputFragments, const WindowRectangle& scissorRect);
|
|
void executeStencilCompare (int fragNdxOffset, int numSamplesPerFragment, const Fragment* inputFragments, const StencilState& stencilState, int numStencilBits, const tcu::ConstPixelBufferAccess& stencilBuffer);
|
|
void executeStencilSFail (int fragNdxOffset, int numSamplesPerFragment, const Fragment* inputFragments, const StencilState& stencilState, int numStencilBits, const tcu::PixelBufferAccess& stencilBuffer);
|
|
void executeDepthBoundsTest (int fragNdxOffset, int numSamplesPerFragment, const Fragment* inputFragments, const float minDepthBound, const float maxDepthBound, const tcu::ConstPixelBufferAccess& depthBuffer);
|
|
void executeDepthCompare (int fragNdxOffset, int numSamplesPerFragment, const Fragment* inputFragments, TestFunc depthFunc, const tcu::ConstPixelBufferAccess& depthBuffer);
|
|
void executeDepthWrite (int fragNdxOffset, int numSamplesPerFragment, const Fragment* inputFragments, const tcu::PixelBufferAccess& depthBuffer);
|
|
void executeStencilDpFailAndPass (int fragNdxOffset, int numSamplesPerFragment, const Fragment* inputFragments, const StencilState& stencilState, int numStencilBits, const tcu::PixelBufferAccess& stencilBuffer);
|
|
void executeBlendFactorComputeRGB (const tcu::Vec4& blendColor, const BlendState& blendRGBState);
|
|
void executeBlendFactorComputeA (const tcu::Vec4& blendColor, const BlendState& blendAState);
|
|
void executeBlend (const BlendState& blendRGBState, const BlendState& blendAState);
|
|
void executeAdvancedBlend (BlendEquationAdvanced equation);
|
|
|
|
void executeColorWrite (int fragNdxOffset, int numSamplesPerFragment, const Fragment* inputFragments, bool isSRGB, const tcu::PixelBufferAccess& colorBuffer);
|
|
void executeRGBA8ColorWrite (int fragNdxOffset, int numSamplesPerFragment, const Fragment* inputFragments, const tcu::PixelBufferAccess& colorBuffer);
|
|
void executeMaskedColorWrite (int fragNdxOffset, int numSamplesPerFragment, const Fragment* inputFragments, const tcu::Vec4& colorMaskFactor, const tcu::Vec4& colorMaskNegationFactor, bool isSRGB, const tcu::PixelBufferAccess& colorBuffer);
|
|
void executeSignedValueWrite (int fragNdxOffset, int numSamplesPerFragment, const Fragment* inputFragments, const tcu::BVec4& colorMask, const tcu::PixelBufferAccess& colorBuffer);
|
|
void executeUnsignedValueWrite (int fragNdxOffset, int numSamplesPerFragment, const Fragment* inputFragments, const tcu::BVec4& colorMask, const tcu::PixelBufferAccess& colorBuffer);
|
|
|
|
SampleData m_sampleRegister[SAMPLE_REGISTER_SIZE];
|
|
} DE_WARN_UNUSED_TYPE;
|
|
|
|
} // rr
|
|
|
|
#endif // _RRFRAGMENTOPERATIONS_HPP
|