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;}
bool Begin();
bool End()
virtual bool Begin();
virtual bool End()
{
if(!cmd_begin)
return(false);
@ -50,6 +50,8 @@ public:
#endif//_DEBUG
};//class GPUCmdBuffer
class DescriptorBinding;
class RenderCmdBuffer:public GPUCmdBuffer
{
uint32_t cv_count;
@ -60,6 +62,8 @@ class RenderCmdBuffer:public GPUCmdBuffer
RenderPassBeginInfo rp_begin;
VkPipelineLayout pipeline_layout;
DescriptorBinding *desc_binding=nullptr;
private:
void SetClear();
@ -69,6 +73,15 @@ public:
RenderCmdBuffer(const GPUDeviceAttribute *attr,VkCommandBuffer cb);
~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 VkExtent2D &);
void SetViewport(const VkViewport &vp){viewport=vp;}

View File

@ -1,112 +1,109 @@
#ifndef HGL_GRAPH_DESCRIPTOR_BINDING_MANAGE_INCLUDE
#define HGL_GRAPH_DESCRIPTOR_BINDING_MANAGE_INCLUDE
#pragma once
#include<hgl/type/Map.h>
#include<hgl/type/String.h>
#include<hgl/graph/VK.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;
class Texture;
class Material;
class MaterialParameters;
set_type=dst;
}
/**
* <Br>
*
*/
class DescriptorBinding
{
DescriptorSetType set_type; ///<描述符合集类型
bool AddUBO(const AnsiString &name,DeviceBuffer *buf)
{
if(!buf)return(false);
if(name.IsEmpty())return(false);
Map<AnsiString,DeviceBuffer *> ubo_map;
Map<AnsiString,DeviceBuffer *> ssbo_map;
Map<AnsiString,Texture *> texture_map;
return ubo_map.Add(name,buf);
}
public:
DeviceBuffer *GetUBO(const AnsiString &name)
{
if(name.IsEmpty())return(nullptr);
DescriptorBinding(const DescriptorSetType &dst)
{
set_type=dst;
}
return GetObjectFromList(ubo_map,name);
}
bool AddUBO(const AnsiString &name,DeviceBuffer *buf)
{
if(!buf)return(false);
if(name.IsEmpty())return(false);
void RemoveUBO(DeviceBuffer *buf)
{
if(!buf)return;
return ubo_map.Add(name,buf);
}
ubo_map.DeleteByValue(buf);
}
DeviceBuffer *GetUBO(const AnsiString &name)
{
if(name.IsEmpty())return(nullptr);
bool AddSSBO(const AnsiString &name,DeviceBuffer *buf)
{
if(!buf)return(false);
if(name.IsEmpty())return(false);
return GetObjectFromList(ubo_map,name);
}
return ssbo_map.Add(name,buf);
}
void RemoveUBO(DeviceBuffer *buf)
{
if(!buf)return;
DeviceBuffer *GetSSBO(const AnsiString &name)
{
if(name.IsEmpty())return(nullptr);
ubo_map.DeleteByValue(buf);
}
return GetObjectFromList(ssbo_map,name);
}
bool AddSSBO(const AnsiString &name,DeviceBuffer *buf)
{
if(!buf)return(false);
if(name.IsEmpty())return(false);
void RemoveSSBO(DeviceBuffer *buf)
{
if(!buf)return;
return ssbo_map.Add(name,buf);
}
ssbo_map.DeleteByValue(buf);
}
DeviceBuffer *GetSSBO(const AnsiString &name)
{
if(name.IsEmpty())return(nullptr);
bool AddTexture(const AnsiString &name,Texture *tex)
{
if(!tex)return(false);
if(name.IsEmpty())return(false);
return GetObjectFromList(ssbo_map,name);
}
return texture_map.Add(name,tex);
}
void RemoveSSBO(DeviceBuffer *buf)
{
if(!buf)return;
Texture *GetTexture(const AnsiString &name)
{
if(name.IsEmpty())return(nullptr);
ssbo_map.DeleteByValue(buf);
}
return GetObjectFromList(texture_map,name);
}
bool AddTexture(const AnsiString &name,Texture *tex)
{
if(!tex)return(false);
if(name.IsEmpty())return(false);
void RemoveTexture(Texture *tex)
{
if(!tex)return;
return texture_map.Add(name,tex);
}
texture_map.DeleteByValue(tex);
}
Texture *GetTexture(const AnsiString &name)
{
if(name.IsEmpty())return(nullptr);
private:
return GetObjectFromList(texture_map,name);
}
void BindUBO(MaterialParameters *,const BindingMap &,bool dynamic);
void RemoveTexture(Texture *tex)
{
if(!tex)return;
public:
texture_map.DeleteByValue(tex);
}
bool Bind(Material *);
};//class DescriptorBinding
private:
void BindUBO(MaterialParameters *,const BindingMap &,bool dynamic);
public:
bool Bind(Material *);
};//class DescriptorBinding
}//namespace graph
}//namespace hgl
#endif//HGL_GRAPH_DESCRIPTOR_BINDING_MANAGE_INCLUDE
VK_NAMESPACE_END

View File

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

View File

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

View File

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

View File

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

View File

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