qzdoom/src/rendering/vulkan/renderer/vk_renderstate.h

105 lines
3 KiB
C
Raw Normal View History

#pragma once
#include "vulkan/system/vk_buffers.h"
#include "vulkan/shaders/vk_shader.h"
#include "vulkan/renderer/vk_renderpass.h"
#include "name.h"
#include "hwrenderer/scene/hw_drawstructs.h"
#include "hwrenderer/scene/hw_renderstate.h"
#include "hwrenderer/textures/hw_material.h"
class VkRenderPassSetup;
class VkRenderState : public FRenderState
{
public:
VkRenderState();
// Draw commands
void ClearScreen() override;
void Draw(int dt, int index, int count, bool apply = true) override;
void DrawIndexed(int dt, int index, int count, bool apply = true) override;
// Immediate render state change commands. These only change infrequently and should not clutter the render state.
bool SetDepthClamp(bool on) override;
void SetDepthMask(bool on) override;
void SetDepthFunc(int func) override;
void SetDepthRange(float min, float max) override;
void SetColorMask(bool r, bool g, bool b, bool a) override;
void EnableDrawBufferAttachments(bool on) override;
void SetStencil(int offs, int op, int flags = -1) override;
void SetCulling(int mode) override;
void EnableClipDistance(int num, bool state) override;
void Clear(int targets) override;
void EnableStencil(bool on) override;
void SetScissor(int x, int y, int w, int h) override;
void SetViewport(int x, int y, int w, int h) override;
void EnableDepthTest(bool on) override;
void EnableMultisampling(bool on) override;
void EnableLineSmooth(bool on) override;
void Bind(int bindingpoint, uint32_t offset);
void EndRenderPass();
private:
void Apply(int dt);
2019-03-02 22:39:44 +00:00
void ApplyRenderPass(int dt);
void ApplyStencilRef();
2019-03-02 22:39:44 +00:00
void ApplyScissor();
void ApplyViewport();
void ApplyStreamData();
void ApplyMatrices();
void ApplyPushConstants();
void ApplyDynamicSet();
void ApplyVertexBuffers();
void ApplyMaterial();
bool mLastDepthClamp = true;
VulkanCommandBuffer *mCommandBuffer = nullptr;
VkRenderPassKey mRenderPassKey = {};
bool mNeedApply = true;
int mScissorX = 0, mScissorY = 0, mScissorWidth = -1, mScissorHeight = -1;
int mViewportX = 0, mViewportY = 0, mViewportWidth = -1, mViewportHeight = -1;
float mViewportDepthMin = 0.0f, mViewportDepthMax = 1.0f;
bool mScissorChanged = true;
bool mViewportChanged = true;
bool mDepthTest = false;
bool mDepthWrite = false;
bool mStencilTest = false;
bool mStencilRefChanged = false;
int mStencilRef = 0;
int mStencilOp = 0;
int mDepthFunc = 0;
int mColorMask = 15;
int mCullMode = 0;
MatricesUBO mMatrices = {};
2019-03-02 22:20:29 +00:00
StreamData mStreamData = {};
PushConstants mPushConstants = {};
2019-03-02 22:39:44 +00:00
uint32_t mLastViewpointOffset = 0xffffffff;
uint32_t mLastLightBufferOffset = 0xffffffff;
uint32_t mViewpointOffset = 0;
uint32_t mLightBufferOffset = 0;
uint32_t mMatricesOffset = 0;
2019-03-02 22:20:29 +00:00
uint32_t mDataIndex = -1;
uint32_t mStreamDataOffset = 0;
2019-03-02 22:47:56 +00:00
VSMatrix mIdentityMatrix;
IVertexBuffer *mLastVertexBuffer = nullptr;
IIndexBuffer *mLastIndexBuffer = nullptr;
bool mLastGlowEnabled = true;
bool mLastGradientEnabled = true;
bool mLastSplitEnabled = true;
bool mLastModelMatrixEnabled = true;
bool mLastTextureMatrixEnabled = true;
};