2017-10-10 23:32:13 +02:00
|
|
|
#pragma once
|
|
|
|
|
2017-10-15 17:56:06 +02:00
|
|
|
#include "dxvk_barrier.h"
|
2017-10-10 23:32:13 +02:00
|
|
|
#include "dxvk_cmdlist.h"
|
2017-10-11 23:29:05 +02:00
|
|
|
#include "dxvk_context_state.h"
|
2017-10-14 14:28:31 +02:00
|
|
|
#include "dxvk_deferred.h"
|
2017-10-15 17:56:06 +02:00
|
|
|
#include "dxvk_pipemgr.h"
|
|
|
|
#include "dxvk_util.h"
|
2017-10-10 23:32:13 +02:00
|
|
|
|
|
|
|
namespace dxvk {
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \brief DXVk context
|
|
|
|
*
|
|
|
|
* Tracks pipeline state and records command lists.
|
|
|
|
* This is where the actual rendering commands are
|
|
|
|
* recorded.
|
|
|
|
*/
|
|
|
|
class DxvkContext : public RcObject {
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
2017-10-14 23:52:47 +02:00
|
|
|
DxvkContext(
|
2017-10-15 17:56:06 +02:00
|
|
|
const Rc<DxvkDevice>& device,
|
|
|
|
const Rc<DxvkPipelineManager>& pipeMgr);
|
2017-10-10 23:32:13 +02:00
|
|
|
~DxvkContext();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \brief Begins command buffer recording
|
|
|
|
*
|
|
|
|
* Begins recording a command list. This does
|
|
|
|
* not alter any context state other than the
|
|
|
|
* active command list.
|
2017-10-14 14:28:31 +02:00
|
|
|
* \param [in] recorder Target recorder
|
2017-10-10 23:32:13 +02:00
|
|
|
*/
|
|
|
|
void beginRecording(
|
2017-10-14 14:28:31 +02:00
|
|
|
const Rc<DxvkRecorder>& recorder);
|
2017-10-10 23:32:13 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* \brief Ends command buffer recording
|
|
|
|
*
|
|
|
|
* Finishes recording the active command list.
|
|
|
|
* The command list can then be submitted to
|
|
|
|
* the device.
|
|
|
|
*
|
|
|
|
* This will not change any context state
|
|
|
|
* other than the active command list.
|
|
|
|
*/
|
2017-11-17 19:49:44 +01:00
|
|
|
void endRecording();
|
2017-10-10 23:32:13 +02:00
|
|
|
|
2017-10-15 17:56:06 +02:00
|
|
|
/**
|
|
|
|
* \brief Sets framebuffer
|
|
|
|
* \param [in] fb Framebuffer
|
|
|
|
*/
|
|
|
|
void bindFramebuffer(
|
|
|
|
const Rc<DxvkFramebuffer>& fb);
|
|
|
|
|
2017-11-20 13:21:27 +01:00
|
|
|
/**
|
|
|
|
* \brief Binds index buffer
|
|
|
|
* \param [in] buffer New index buffer
|
|
|
|
*/
|
|
|
|
void bindIndexBuffer(
|
|
|
|
const DxvkBufferBinding& buffer);
|
|
|
|
|
2017-10-15 17:56:06 +02:00
|
|
|
/**
|
|
|
|
* \brief Sets shader for a given shader stage
|
|
|
|
*
|
|
|
|
* Binds a shader to a given stage, while unbinding the
|
|
|
|
* existing one. If \c nullptr is passed as the shader
|
|
|
|
* to bind, the given shader stage will be disabled.
|
|
|
|
* When drawing, at least a vertex shader must be bound.
|
|
|
|
* \param [in] stage The shader stage
|
|
|
|
* \param [in] shader The shader to set
|
|
|
|
*/
|
|
|
|
void bindShader(
|
|
|
|
VkShaderStageFlagBits stage,
|
|
|
|
const Rc<DxvkShader>& shader);
|
|
|
|
|
2017-11-20 13:21:27 +01:00
|
|
|
/**
|
|
|
|
* \brief Binds vertex buffer
|
|
|
|
*
|
|
|
|
* \param [in] binding Vertex buffer binding
|
|
|
|
* \param [in] buffer New vertex buffer
|
|
|
|
*/
|
|
|
|
void bindVertexBuffer(
|
|
|
|
uint32_t binding,
|
|
|
|
const DxvkBufferBinding& buffer);
|
|
|
|
|
2017-10-11 23:29:05 +02:00
|
|
|
/**
|
|
|
|
* \brief Clears an active render target
|
|
|
|
*
|
|
|
|
* \param [in] attachment Attachment to clear
|
|
|
|
* \param [in] clearArea Rectangular area to clear
|
|
|
|
*/
|
|
|
|
void clearRenderTarget(
|
|
|
|
const VkClearAttachment& attachment,
|
|
|
|
const VkClearRect& clearArea);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \brief Draws primitive without using an index buffer
|
|
|
|
*
|
|
|
|
* \param [in] vertexCount Number of vertices to draw
|
|
|
|
* \param [in] instanceCount Number of instances to render
|
|
|
|
* \param [in] firstVertex First vertex in vertex buffer
|
|
|
|
* \param [in] firstInstance First instance ID
|
|
|
|
*/
|
|
|
|
void draw(
|
|
|
|
uint32_t vertexCount,
|
|
|
|
uint32_t instanceCount,
|
|
|
|
uint32_t firstVertex,
|
|
|
|
uint32_t firstInstance);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \brief Draws primitives using an index buffer
|
|
|
|
*
|
|
|
|
* \param [in] indexCount Number of indices to draw
|
|
|
|
* \param [in] instanceCount Number of instances to render
|
|
|
|
* \param [in] firstIndex First index within the index buffer
|
|
|
|
* \param [in] vertexOffset Vertex ID that corresponds to index 0
|
|
|
|
* \param [in] firstInstance First instance ID
|
|
|
|
*/
|
|
|
|
void drawIndexed(
|
|
|
|
uint32_t indexCount,
|
|
|
|
uint32_t instanceCount,
|
|
|
|
uint32_t firstIndex,
|
|
|
|
uint32_t vertexOffset,
|
|
|
|
uint32_t firstInstance);
|
|
|
|
|
2017-11-20 13:38:24 +01:00
|
|
|
/**
|
|
|
|
* \brief Sets input assembly state
|
|
|
|
* \param [in] state New state object
|
|
|
|
*/
|
|
|
|
void setInputAssemblyState(
|
|
|
|
const Rc<DxvkInputAssemblyState>& state);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \brief Sets input layout state
|
|
|
|
* \param [in] state New state object
|
|
|
|
*/
|
|
|
|
void setInputLayout(
|
|
|
|
const Rc<DxvkInputLayout>& state);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \brief Sets rasterizer state
|
|
|
|
* \param [in] state New state object
|
|
|
|
*/
|
|
|
|
void setRasterizerState(
|
|
|
|
const Rc<DxvkRasterizerState>& state);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \brief Sets multisample state
|
|
|
|
* \param [in] state New state object
|
|
|
|
*/
|
|
|
|
void setMultisampleState(
|
|
|
|
const Rc<DxvkMultisampleState>& state);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \brief Sets depth stencil state
|
|
|
|
* \param [in] state New state object
|
|
|
|
*/
|
|
|
|
void setDepthStencilState(
|
|
|
|
const Rc<DxvkDepthStencilState>& state);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \brief Sets color blend state
|
|
|
|
* \param [in] state New state object
|
|
|
|
*/
|
|
|
|
void setBlendState(
|
|
|
|
const Rc<DxvkBlendState>& state);
|
|
|
|
|
2017-10-10 23:32:13 +02:00
|
|
|
private:
|
|
|
|
|
2017-10-15 17:56:06 +02:00
|
|
|
const Rc<DxvkDevice> m_device;
|
|
|
|
const Rc<DxvkPipelineManager> m_pipeMgr;
|
2017-10-14 23:52:47 +02:00
|
|
|
|
2017-10-14 14:28:31 +02:00
|
|
|
Rc<DxvkRecorder> m_cmd;
|
|
|
|
DxvkContextState m_state;
|
2017-10-11 23:29:05 +02:00
|
|
|
|
2017-11-17 19:49:44 +01:00
|
|
|
void renderPassBegin();
|
|
|
|
void renderPassEnd();
|
2017-10-10 23:32:13 +02:00
|
|
|
|
2017-11-17 19:49:44 +01:00
|
|
|
void bindGraphicsPipeline();
|
2017-11-20 13:21:27 +01:00
|
|
|
void bindDynamicState();
|
|
|
|
void bindIndexBuffer();
|
|
|
|
void bindVertexBuffers();
|
2017-10-15 17:56:06 +02:00
|
|
|
|
2017-11-17 19:49:44 +01:00
|
|
|
void flushGraphicsState();
|
2017-10-15 17:56:06 +02:00
|
|
|
|
2017-11-17 19:49:44 +01:00
|
|
|
DxvkShaderStageState* getShaderStage(
|
|
|
|
VkShaderStageFlagBits stage);
|
2017-10-15 17:56:06 +02:00
|
|
|
|
2017-10-10 23:32:13 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
}
|