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,112 +1,109 @@
#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
VK_NAMESPACE_BEGIN
class DeviceBuffer;
class Texture;
class Material;
class MaterialParameters;
/**
* <Br>
*
*/
class DescriptorBinding
{ {
namespace graph DescriptorSetType set_type; ///<描述符合集类型
Map<AnsiString,DeviceBuffer *> ubo_map;
Map<AnsiString,DeviceBuffer *> ssbo_map;
Map<AnsiString,Texture *> texture_map;
public:
DescriptorBinding(const DescriptorSetType &dst)
{ {
class DeviceBuffer; set_type=dst;
class Texture; }
class Material;
class MaterialParameters;
/** bool AddUBO(const AnsiString &name,DeviceBuffer *buf)
* <Br> {
* if(!buf)return(false);
*/ if(name.IsEmpty())return(false);
class DescriptorBinding
{
DescriptorSetType set_type; ///<描述符合集类型
Map<AnsiString,DeviceBuffer *> ubo_map; return ubo_map.Add(name,buf);
Map<AnsiString,DeviceBuffer *> ssbo_map; }
Map<AnsiString,Texture *> texture_map;
public: DeviceBuffer *GetUBO(const AnsiString &name)
{
if(name.IsEmpty())return(nullptr);
DescriptorBinding(const DescriptorSetType &dst) return GetObjectFromList(ubo_map,name);
{ }
set_type=dst;
}
bool AddUBO(const AnsiString &name,DeviceBuffer *buf) void RemoveUBO(DeviceBuffer *buf)
{ {
if(!buf)return(false); if(!buf)return;
if(name.IsEmpty())return(false);
return ubo_map.Add(name,buf); ubo_map.DeleteByValue(buf);
} }
DeviceBuffer *GetUBO(const AnsiString &name) bool AddSSBO(const AnsiString &name,DeviceBuffer *buf)
{ {
if(name.IsEmpty())return(nullptr); if(!buf)return(false);
if(name.IsEmpty())return(false);
return GetObjectFromList(ubo_map,name); return ssbo_map.Add(name,buf);
} }
void RemoveUBO(DeviceBuffer *buf) DeviceBuffer *GetSSBO(const AnsiString &name)
{ {
if(!buf)return; if(name.IsEmpty())return(nullptr);
ubo_map.DeleteByValue(buf); return GetObjectFromList(ssbo_map,name);
} }
bool AddSSBO(const AnsiString &name,DeviceBuffer *buf) void RemoveSSBO(DeviceBuffer *buf)
{ {
if(!buf)return(false); if(!buf)return;
if(name.IsEmpty())return(false);
return ssbo_map.Add(name,buf); ssbo_map.DeleteByValue(buf);
} }
DeviceBuffer *GetSSBO(const AnsiString &name) bool AddTexture(const AnsiString &name,Texture *tex)
{ {
if(name.IsEmpty())return(nullptr); if(!tex)return(false);
if(name.IsEmpty())return(false);
return GetObjectFromList(ssbo_map,name); return texture_map.Add(name,tex);
} }
void RemoveSSBO(DeviceBuffer *buf) Texture *GetTexture(const AnsiString &name)
{ {
if(!buf)return; if(name.IsEmpty())return(nullptr);
ssbo_map.DeleteByValue(buf); return GetObjectFromList(texture_map,name);
} }
bool AddTexture(const AnsiString &name,Texture *tex) void RemoveTexture(Texture *tex)
{ {
if(!tex)return(false); if(!tex)return;
if(name.IsEmpty())return(false);
return texture_map.Add(name,tex); texture_map.DeleteByValue(tex);
} }
Texture *GetTexture(const AnsiString &name) private:
{
if(name.IsEmpty())return(nullptr);
return GetObjectFromList(texture_map,name); void BindUBO(MaterialParameters *,const BindingMap &,bool dynamic);
}
void RemoveTexture(Texture *tex) public:
{
if(!tex)return;
texture_map.DeleteByValue(tex); bool Bind(Material *);
} };//class DescriptorBinding
private: VK_NAMESPACE_END
void BindUBO(MaterialParameters *,const BindingMap &,bool dynamic);
public:
bool Bind(Material *);
};//class DescriptorBinding
}//namespace graph
}//namespace hgl
#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
@ -30,12 +31,15 @@ class IRenderTarget
VkExtent2D extent; VkExtent2D extent;
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);
} }
@ -40,4 +44,4 @@ void RenderTargetData::Clear()
SAFE_CLEAR(depth_texture); SAFE_CLEAR(depth_texture);
} }
VK_NAMESPACE_END VK_NAMESPACE_END

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);