Procházet zdrojové kódy

vulkan: Fix assorted bugs

rdb před 5 roky
rodič
revize
b4137f357c

+ 1 - 0
panda/src/vulkandisplay/vulkanGraphicsBuffer.cxx

@@ -176,6 +176,7 @@ begin_frame(FrameMode mode, Thread *current_thread) {
 
   vkCmdBeginRenderPass(cmd, &begin_info, VK_SUBPASS_CONTENTS_INLINE);
   vkgsg->_render_pass = _render_pass;
+  vkgsg->_fb_ms_count = VK_SAMPLE_COUNT_1_BIT;
 
   return true;
 }

+ 10 - 11
panda/src/vulkandisplay/vulkanGraphicsStateGuardian.cxx

@@ -64,14 +64,12 @@ TypeHandle VulkanGraphicsStateGuardian::_type_handle;
 VulkanGraphicsStateGuardian::
 VulkanGraphicsStateGuardian(GraphicsEngine *engine, VulkanGraphicsPipe *pipe,
                             VulkanGraphicsStateGuardian *share_with,
-                            uint32_t queue_family_index,
-                            VkSampleCountFlagBits multisample_count) :
+                            uint32_t queue_family_index) :
   GraphicsStateGuardian(CS_default, engine, pipe),
   _device(VK_NULL_HANDLE),
   _queue(VK_NULL_HANDLE),
   _dma_queue(VK_NULL_HANDLE),
   _graphics_queue_family_index(queue_family_index),
-  _multisample_count(multisample_count),
   _cmd_pool(VK_NULL_HANDLE),
   _cmd(VK_NULL_HANDLE),
   _transfer_cmd(VK_NULL_HANDLE),
@@ -291,7 +289,7 @@ VulkanGraphicsStateGuardian(GraphicsEngine *engine, VulkanGraphicsPipe *pipe,
   _copy_texture_inverted = true;
 
   // Similarly with these capabilities flags.
-  _supports_multisample = (multisample_count > VK_SAMPLE_COUNT_1_BIT);
+  _supports_multisample = true;
   _supports_generate_mipmap = false;
   _supports_depth_texture = true;
   _supports_depth_stencil = true;
@@ -1715,10 +1713,11 @@ set_state_and_transform(const RenderState *state,
 
   VulkanShaderContext *sc = _default_sc;
   const ShaderAttrib *sa;
-  if (state->get_attrib(sa) && sa->has_shader()) {
+  if (state->get_attrib(sa)) {
     Shader *shader = (Shader *)sa->get_shader();
-    nassertv(shader != nullptr);
-    DCAST_INTO_V(sc, shader->prepare_now(get_prepared_objects(), this));
+    if (shader != nullptr) {
+      DCAST_INTO_V(sc, shader->prepare_now(get_prepared_objects(), this));
+    }
   }
 
   _current_shader = sc;
@@ -2558,7 +2557,7 @@ bool VulkanGraphicsStateGuardian::
 do_draw_primitive(const GeomPrimitivePipelineReader *reader, bool force,
                   VkPrimitiveTopology topology) {
 
-  VkPipeline pipeline = _current_shader->get_pipeline(this, _state_rs, _format, topology);
+  VkPipeline pipeline = _current_shader->get_pipeline(this, _state_rs, _format, topology, _fb_ms_count);
   nassertr(pipeline != VK_NULL_HANDLE, false);
   vkCmdBindPipeline(_cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
 
@@ -2707,7 +2706,8 @@ create_semaphore() {
  */
 VkPipeline VulkanGraphicsStateGuardian::
 make_pipeline(VulkanShaderContext *sc, const RenderState *state,
-              const GeomVertexFormat *format, VkPrimitiveTopology topology) {
+              const GeomVertexFormat *format, VkPrimitiveTopology topology,
+              VkSampleCountFlagBits multisamples) {
   if (vulkandisplay_cat.is_debug()) {
     vulkandisplay_cat.debug()
       << "Making pipeline for state " << *state << " and format " << *format << "\n";
@@ -2951,7 +2951,7 @@ make_pipeline(VulkanShaderContext *sc, const RenderState *state,
   ms_info.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
   ms_info.pNext = nullptr;
   ms_info.flags = 0;
-  ms_info.rasterizationSamples = _multisample_count;
+  ms_info.rasterizationSamples = multisamples;
   ms_info.sampleShadingEnable = VK_FALSE;
   ms_info.minSampleShading = 0.0;
   ms_info.pSampleMask = nullptr;
@@ -3184,7 +3184,6 @@ get_attrib_descriptor_set(VkDescriptorSet &out, VkDescriptorSetLayout layout, co
       return !is_current;
     }
 
-
     // It's been deleted, which means it's for a very different state.  We can
     // let go of this one and create a new one instead.
     if (!set._weak_ref->unref()) {

+ 2 - 3
panda/src/vulkandisplay/vulkanGraphicsStateGuardian.h

@@ -30,8 +30,7 @@ class VulkanGraphicsStateGuardian final : public GraphicsStateGuardian {
 public:
   VulkanGraphicsStateGuardian(GraphicsEngine *engine, VulkanGraphicsPipe *pipe,
                               VulkanGraphicsStateGuardian *share_with,
-                              uint32_t queue_family_index,
-                              VkSampleCountFlagBits multisample_count=VK_SAMPLE_COUNT_1_BIT);
+                              uint32_t queue_family_index);
   virtual ~VulkanGraphicsStateGuardian();
 
   virtual void close_gsg();
@@ -176,7 +175,6 @@ private:
   uint64_t _frame_counter = 0;
   VkQueue _queue;
   VkQueue _dma_queue;
-  VkSampleCountFlagBits _multisample_count;
   VkFence _fence;
   VkCommandPool _cmd_pool;
   pvector<VkRect2D> _viewports;
@@ -199,6 +197,7 @@ private:
   VkRenderPass _render_pass;
   VulkanTextureContext *_fb_color_tc;
   VulkanTextureContext *_fb_depth_tc;
+  VkSampleCountFlagBits _fb_ms_count = VK_SAMPLE_COUNT_1_BIT;
   VkSemaphore _wait_semaphore;
   VkSemaphore _signal_semaphore;
 

+ 2 - 6
panda/src/vulkandisplay/vulkanGraphicsWindow.cxx

@@ -228,6 +228,7 @@ begin_frame(FrameMode mode, Thread *current_thread) {
   vkgsg->_render_pass = _render_pass;
   vkgsg->_fb_color_tc = color_tc;
   vkgsg->_fb_depth_tc = _depth_stencil_tc;
+  vkgsg->_fb_ms_count = _ms_count;
   vkgsg->_wait_semaphore = _image_available;
   vkgsg->_signal_semaphore = _render_complete;
 
@@ -492,16 +493,11 @@ open_window() {
     }
 
     // There is no old gsg.  Create a new one.
-    vkgsg = new VulkanGraphicsStateGuardian(_engine, vkpipe, nullptr, queue_family_index, _ms_count);
+    vkgsg = new VulkanGraphicsStateGuardian(_engine, vkpipe, nullptr, queue_family_index);
     _gsg = vkgsg;
   } else {
     //TODO: check that the GSG's queue can present to our surface.
     DCAST_INTO_R(vkgsg, _gsg.p(), false);
-
-    if (vkgsg == nullptr || vkgsg->_multisample_count != _ms_count) {
-      vkgsg = new VulkanGraphicsStateGuardian(_engine, vkpipe, nullptr, queue_family_index, _ms_count);
-      _gsg = vkgsg;
-    }
   }
 
   if (!vkgsg->is_valid()) {

+ 1 - 1
panda/src/vulkandisplay/vulkanShaderContext.I

@@ -29,7 +29,7 @@ VulkanShaderContext(Shader *shader) :
  */
 INLINE VulkanShaderContext::
 ~VulkanShaderContext()  {
-  delete _mat_part_cache;
+  delete[] _mat_part_cache;
 }
 
 /**

+ 4 - 2
panda/src/vulkandisplay/vulkanShaderContext.cxx

@@ -447,16 +447,18 @@ update_descriptor_set(VulkanGraphicsStateGuardian *gsg, VkDescriptorSet ds) {
  */
 VkPipeline VulkanShaderContext::
 get_pipeline(VulkanGraphicsStateGuardian *gsg, const RenderState *state,
-             const GeomVertexFormat *format, VkPrimitiveTopology topology) {
+             const GeomVertexFormat *format, VkPrimitiveTopology topology,
+             VkSampleCountFlagBits multisamples) {
   PipelineKey key;
   key._state = state;
   key._format = format;
   key._topology = topology;
+  key._multisamples = multisamples;
 
   PipelineMap::const_iterator it;
   it = _pipeline_map.find(key);
   if (it == _pipeline_map.end()) {
-    VkPipeline pipeline = gsg->make_pipeline(this, state, format, topology);
+    VkPipeline pipeline = gsg->make_pipeline(this, state, format, topology, multisamples);
     _pipeline_map[std::move(key)] = pipeline;
     return pipeline;
   } else {

+ 3 - 1
panda/src/vulkandisplay/vulkanShaderContext.h

@@ -36,7 +36,8 @@ public:
   VkPipeline get_pipeline(VulkanGraphicsStateGuardian *gsg,
                           const RenderState *state,
                           const GeomVertexFormat *format,
-                          VkPrimitiveTopology topology);
+                          VkPrimitiveTopology topology,
+                          VkSampleCountFlagBits multisamples);
   VkPipeline get_compute_pipeline(VulkanGraphicsStateGuardian *gsg);
 
 private:
@@ -77,6 +78,7 @@ private:
     CPT(RenderState) _state;
     CPT(GeomVertexFormat) _format;
     VkPrimitiveTopology _topology;
+    VkSampleCountFlagBits _multisamples;
   };
 
   // A map of all pipelines that use this shader.  This is in ShaderContext