Put the Viewport in a RenderTarget and pass it after RenderCmdBuffer::Begin. auto bind ViewportInfo to any material.

This commit is contained in:
hyzboy 2025-03-05 01:01:48 +08:00
parent 2f1ccda442
commit c5e9f151fc
8 changed files with 122 additions and 90 deletions

@ -1 +1 @@
Subproject commit 2b286a47b677b285e849fc5fa5afe132ed33948f Subproject commit f74d7045fa0d143b94103e49093fe18a1d5a884c

View File

@ -29,8 +29,8 @@ public:
const bool IsBegin()const{return cmd_begin;} const bool IsBegin()const{return cmd_begin;}
bool Begin(); virtual bool Begin();
bool End() virtual bool End()
{ {
if(!cmd_begin) if(!cmd_begin)
return(false); return(false);
@ -50,6 +50,8 @@ public:
#endif//_DEBUG #endif//_DEBUG
};//class GPUCmdBuffer };//class GPUCmdBuffer
class DescriptorBinding;
class RenderCmdBuffer:public GPUCmdBuffer class RenderCmdBuffer:public GPUCmdBuffer
{ {
uint32_t cv_count; uint32_t cv_count;
@ -60,6 +62,8 @@ class RenderCmdBuffer:public GPUCmdBuffer
RenderPassBeginInfo rp_begin; RenderPassBeginInfo rp_begin;
VkPipelineLayout pipeline_layout; VkPipelineLayout pipeline_layout;
DescriptorBinding *desc_binding=nullptr;
private: private:
void SetClear(); void SetClear();
@ -69,6 +73,15 @@ public:
RenderCmdBuffer(const GPUDeviceAttribute *attr,VkCommandBuffer cb); RenderCmdBuffer(const GPUDeviceAttribute *attr,VkCommandBuffer cb);
~RenderCmdBuffer(); ~RenderCmdBuffer();
void SetDescriptorBinding(DescriptorBinding *db) { desc_binding=db; }
bool End() override
{
desc_binding=nullptr;
return GPUCmdBuffer::End();
}
void SetRenderArea(const VkRect2D &ra){render_area=ra;} void SetRenderArea(const VkRect2D &ra){render_area=ra;}
void SetRenderArea(const VkExtent2D &); void SetRenderArea(const VkExtent2D &);
void SetViewport(const VkViewport &vp){viewport=vp;} void SetViewport(const VkViewport &vp){viewport=vp;}

View File

@ -1,32 +1,30 @@
#ifndef HGL_GRAPH_DESCRIPTOR_BINDING_MANAGE_INCLUDE #pragma once
#define HGL_GRAPH_DESCRIPTOR_BINDING_MANAGE_INCLUDE
#include<hgl/type/Map.h> #include<hgl/type/Map.h>
#include<hgl/type/String.h> #include<hgl/type/String.h>
#include<hgl/graph/VK.h> #include<hgl/graph/VK.h>
#include<hgl/graph/VKDescriptorSetType.h> #include<hgl/graph/VKDescriptorSetType.h>
namespace hgl
{
namespace graph
{
class DeviceBuffer;
class Texture;
class Material;
class MaterialParameters;
/** VK_NAMESPACE_BEGIN
class DeviceBuffer;
class Texture;
class Material;
class MaterialParameters;
/**
* <Br> * <Br>
* *
*/ */
class DescriptorBinding class DescriptorBinding
{ {
DescriptorSetType set_type; ///<描述符合集类型 DescriptorSetType set_type; ///<描述符合集类型
Map<AnsiString,DeviceBuffer *> ubo_map; Map<AnsiString,DeviceBuffer *> ubo_map;
Map<AnsiString,DeviceBuffer *> ssbo_map; Map<AnsiString,DeviceBuffer *> ssbo_map;
Map<AnsiString,Texture *> texture_map; Map<AnsiString,Texture *> texture_map;
public: public:
DescriptorBinding(const DescriptorSetType &dst) DescriptorBinding(const DescriptorSetType &dst)
{ {
@ -99,14 +97,13 @@ namespace hgl
texture_map.DeleteByValue(tex); texture_map.DeleteByValue(tex);
} }
private: private:
void BindUBO(MaterialParameters *,const BindingMap &,bool dynamic); void BindUBO(MaterialParameters *,const BindingMap &,bool dynamic);
public: public:
bool Bind(Material *); bool Bind(Material *);
};//class DescriptorBinding };//class DescriptorBinding
}//namespace graph
}//namespace hgl VK_NAMESPACE_END
#endif//HGL_GRAPH_DESCRIPTOR_BINDING_MANAGE_INCLUDE

View File

@ -7,6 +7,7 @@
#include<hgl/graph/VKQueue.h> #include<hgl/graph/VKQueue.h>
#include<hgl/graph/VKPipeline.h> #include<hgl/graph/VKPipeline.h>
#include<hgl/graph/VKCommandBuffer.h> #include<hgl/graph/VKCommandBuffer.h>
#include<hgl/graph/VKDescriptorBindingManage.h>
//#include<iostream> //#include<iostream>
VK_NAMESPACE_BEGIN VK_NAMESPACE_BEGIN
@ -31,11 +32,14 @@ class IRenderTarget
graph::ViewportInfo vp_info; graph::ViewportInfo vp_info;
graph::DeviceBuffer *ubo_vp_info; graph::DeviceBuffer *ubo_vp_info;
DescriptorBinding desc_binding;
public: public:
RenderFramework * GetRenderFramework ()const{return render_framework;} RenderFramework * GetRenderFramework ()const{return render_framework;}
GPUDevice * GetDevice ()const; GPUDevice * GetDevice ()const;
VkDevice GetVkDevice ()const; VkDevice GetVkDevice ()const;
DescriptorBinding * GetDescriptorBinding(){return &desc_binding;}
const VkExtent2D &GetExtent ()const{return extent;} const VkExtent2D &GetExtent ()const{return extent;}
@ -73,6 +77,14 @@ public: // Command Buffer
virtual RenderCmdBuffer * BeginRender ()=0; virtual RenderCmdBuffer * BeginRender ()=0;
virtual void EndRender ()=0; virtual void EndRender ()=0;
public:
virtual void Bind (Material *mtl)
{
if(mtl)
desc_binding.Bind(mtl);
}
};//class IRenderTarget };//class IRenderTarget
struct RenderTargetData struct RenderTargetData
@ -115,6 +127,8 @@ protected:
RenderTarget(RenderFramework *rf,RenderTargetData *rtd):IRenderTarget(rf,rtd->fbo->GetExtent()) RenderTarget(RenderFramework *rf,RenderTargetData *rtd):IRenderTarget(rf,rtd->fbo->GetExtent())
{ {
data=rtd; data=rtd;
data->cmd_buf->SetDescriptorBinding(GetDescriptorBinding());
} }
public: public:
@ -164,6 +178,7 @@ public:
return(nullptr); return(nullptr);
data->cmd_buf->Begin(); data->cmd_buf->Begin();
data->cmd_buf->SetDescriptorBinding(GetDescriptorBinding());
data->cmd_buf->BindFramebuffer(data->fbo); data->cmd_buf->BindFramebuffer(data->fbo);
return data->cmd_buf; return data->cmd_buf;
} }

View File

@ -91,6 +91,9 @@ bool RenderCmdBuffer::BindDescriptorSets(Material *mtl)
{ {
if(!mtl)return(false); if(!mtl)return(false);
if(desc_binding)
desc_binding->Bind(mtl);
{ {
uint32_t count=0; uint32_t count=0;

View File

@ -5,17 +5,21 @@
#include<hgl/graph/RenderFramework.h> #include<hgl/graph/RenderFramework.h>
#include<hgl/graph/VKBuffer.h> #include<hgl/graph/VKBuffer.h>
#include<hgl/graph/mtl/UBOCommon.h> //未来UBO统合看能不能不引用
VK_NAMESPACE_BEGIN VK_NAMESPACE_BEGIN
GPUDevice *IRenderTarget::GetDevice ()const{return render_framework->GetDevice();} GPUDevice *IRenderTarget::GetDevice ()const{return render_framework->GetDevice();}
VkDevice IRenderTarget::GetVkDevice()const{return render_framework->GetDevice()->GetDevice();} VkDevice IRenderTarget::GetVkDevice()const{return render_framework->GetDevice()->GetDevice();}
IRenderTarget::IRenderTarget(RenderFramework *rf,const VkExtent2D &ext) IRenderTarget::IRenderTarget(RenderFramework *rf,const VkExtent2D &ext):desc_binding(DescriptorSetType::RenderTarget)
{ {
render_framework=rf; render_framework=rf;
ubo_vp_info=GetDevice()->CreateUBO(sizeof(ViewportInfo),&vp_info); ubo_vp_info=GetDevice()->CreateUBO(sizeof(ViewportInfo),&vp_info);
desc_binding.AddUBO(mtl::SBS_ViewportInfo.name,ubo_vp_info);
OnResize(ext); OnResize(ext);
} }

View File

@ -45,7 +45,7 @@ bool Std2DMaterial::CustomVertexShader(ShaderCreateInfoVertex *vsc)
mci->AddStruct(SBS_ViewportInfo); mci->AddStruct(SBS_ViewportInfo);
mci->AddUBO(VK_SHADER_STAGE_ALL_GRAPHICS, mci->AddUBO(VK_SHADER_STAGE_ALL_GRAPHICS,
DescriptorSetType::Static, DescriptorSetType::RenderTarget,
SBS_ViewportInfo); SBS_ViewportInfo);
} }

View File

@ -61,7 +61,7 @@ bool Std3DMaterial::CustomVertexShader(ShaderCreateInfoVertex *vsc)
mci->AddStruct(SBS_ViewportInfo); mci->AddStruct(SBS_ViewportInfo);
mci->AddUBO(VK_SHADER_STAGE_ALL_GRAPHICS, mci->AddUBO(VK_SHADER_STAGE_ALL_GRAPHICS,
DescriptorSetType::Static, DescriptorSetType::RenderTarget,
SBS_ViewportInfo); SBS_ViewportInfo);
return(true); return(true);