mirror of
https://github.com/RPCS3/rpcs3.git
synced 2024-11-17 08:11:51 +00:00
gl: Clear depth surfaces before use; Vulkan cleanup (#1957)
* vk: Clean up a few trap messages vk: silence a few compile errors * gl: Clear new depth surfaces to max_depth gl: use glClear to clear depth buffers
This commit is contained in:
parent
a0c0df6e9d
commit
74fec275c7
@ -394,6 +394,20 @@ void GLGSRender::end()
|
||||
draw_fbo.bind();
|
||||
m_program->use();
|
||||
|
||||
//Check if depth buffer is bound and valid
|
||||
//If ds is not initialized clear it; it seems new depth textures should have depth cleared
|
||||
gl::render_target *ds = std::get<1>(m_rtts.m_bound_depth_stencil);
|
||||
if (ds && !ds->cleared())
|
||||
{
|
||||
glDepthMask(GL_TRUE);
|
||||
glClearDepth(1.f);
|
||||
|
||||
glClear(GL_DEPTH_BUFFER_BIT);
|
||||
glDepthMask(rsx::method_registers.depth_write_enabled());
|
||||
|
||||
ds->set_cleared();
|
||||
}
|
||||
|
||||
//setup textures
|
||||
{
|
||||
for (int i = 0; i < rsx::limits::fragment_textures_count; ++i)
|
||||
@ -696,6 +710,20 @@ bool GLGSRender::do_method(u32 cmd, u32 arg)
|
||||
}
|
||||
|
||||
found->second(arg, this);
|
||||
|
||||
switch (cmd)
|
||||
{
|
||||
case NV4097_CLEAR_SURFACE:
|
||||
{
|
||||
if (arg & 0x1)
|
||||
{
|
||||
gl::render_target *ds = std::get<1>(m_rtts.m_bound_depth_stencil);
|
||||
if (ds && !ds->cleared())
|
||||
ds->set_cleared();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -4,6 +4,31 @@
|
||||
#include "stdafx.h"
|
||||
#include "../RSXThread.h"
|
||||
|
||||
namespace gl
|
||||
{
|
||||
class render_target : public texture
|
||||
{
|
||||
bool is_cleared;
|
||||
|
||||
public:
|
||||
|
||||
render_target()
|
||||
{
|
||||
is_cleared = false;
|
||||
}
|
||||
|
||||
void set_cleared()
|
||||
{
|
||||
is_cleared = true;
|
||||
}
|
||||
|
||||
bool cleared()
|
||||
{
|
||||
return is_cleared;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
struct color_swizzle
|
||||
{
|
||||
gl::texture::channel a = gl::texture::channel::a;
|
||||
@ -47,20 +72,20 @@ namespace rsx
|
||||
|
||||
struct gl_render_target_traits
|
||||
{
|
||||
using surface_storage_type = std::unique_ptr<gl::texture>;
|
||||
using surface_type = gl::texture*;
|
||||
using surface_storage_type = std::unique_ptr<gl::render_target>;
|
||||
using surface_type = gl::render_target*;
|
||||
using command_list_type = void*;
|
||||
using download_buffer_object = std::vector<u8>;
|
||||
|
||||
static
|
||||
std::unique_ptr<gl::texture> create_new_surface(
|
||||
std::unique_ptr<gl::render_target> create_new_surface(
|
||||
u32 address,
|
||||
rsx::surface_color_format surface_color_format,
|
||||
size_t width,
|
||||
size_t height
|
||||
)
|
||||
{
|
||||
std::unique_ptr<gl::texture> result(new gl::texture());
|
||||
std::unique_ptr<gl::render_target> result(new gl::render_target());
|
||||
|
||||
auto format = rsx::internals::surface_color_format_to_gl(surface_color_format);
|
||||
result->recreate(gl::texture::target::texture2D);
|
||||
@ -80,14 +105,14 @@ struct gl_render_target_traits
|
||||
}
|
||||
|
||||
static
|
||||
std::unique_ptr<gl::texture> create_new_surface(
|
||||
std::unique_ptr<gl::render_target> create_new_surface(
|
||||
u32 address,
|
||||
rsx::surface_depth_format surface_depth_format,
|
||||
size_t width,
|
||||
size_t height
|
||||
)
|
||||
{
|
||||
std::unique_ptr<gl::texture> result(new gl::texture());
|
||||
std::unique_ptr<gl::render_target> result(new gl::render_target());
|
||||
|
||||
auto format = rsx::internals::surface_depth_format_to_gl(surface_depth_format);
|
||||
result->recreate(gl::texture::target::texture2D);
|
||||
@ -106,27 +131,27 @@ struct gl_render_target_traits
|
||||
return result;
|
||||
}
|
||||
|
||||
static void prepare_rtt_for_drawing(void *, gl::texture*) {}
|
||||
static void prepare_rtt_for_sampling(void *, gl::texture*) {}
|
||||
static void prepare_ds_for_drawing(void *, gl::texture*) {}
|
||||
static void prepare_ds_for_sampling(void *, gl::texture*) {}
|
||||
static void prepare_rtt_for_drawing(void *, gl::render_target*) {}
|
||||
static void prepare_rtt_for_sampling(void *, gl::render_target*) {}
|
||||
static void prepare_ds_for_drawing(void *, gl::render_target*) {}
|
||||
static void prepare_ds_for_sampling(void *, gl::render_target*) {}
|
||||
|
||||
static
|
||||
bool rtt_has_format_width_height(const std::unique_ptr<gl::texture> &rtt, rsx::surface_color_format surface_color_format, size_t width, size_t height)
|
||||
bool rtt_has_format_width_height(const std::unique_ptr<gl::render_target> &rtt, rsx::surface_color_format surface_color_format, size_t width, size_t height)
|
||||
{
|
||||
// TODO: check format
|
||||
return rtt->width() == width && rtt->height() == height;
|
||||
}
|
||||
|
||||
static
|
||||
bool ds_has_format_width_height(const std::unique_ptr<gl::texture> &rtt, rsx::surface_depth_format surface_depth_stencil_format, size_t width, size_t height)
|
||||
bool ds_has_format_width_height(const std::unique_ptr<gl::render_target> &rtt, rsx::surface_depth_format surface_depth_stencil_format, size_t width, size_t height)
|
||||
{
|
||||
// TODO: check format
|
||||
return rtt->width() == width && rtt->height() == height;
|
||||
}
|
||||
|
||||
// Note : pbo breaks fbo here so use classic texture copy
|
||||
static std::vector<u8> issue_download_command(gl::texture* color_buffer, rsx::surface_color_format color_format, size_t width, size_t height)
|
||||
static std::vector<u8> issue_download_command(gl::render_target* color_buffer, rsx::surface_color_format color_format, size_t width, size_t height)
|
||||
{
|
||||
auto pixel_format = rsx::internals::surface_color_format_to_gl(color_format);
|
||||
std::vector<u8> result(width * height * pixel_format.channel_count * pixel_format.channel_size);
|
||||
@ -135,7 +160,7 @@ struct gl_render_target_traits
|
||||
return result;
|
||||
}
|
||||
|
||||
static std::vector<u8> issue_depth_download_command(gl::texture* depth_stencil_buffer, rsx::surface_depth_format depth_format, size_t width, size_t height)
|
||||
static std::vector<u8> issue_depth_download_command(gl::render_target* depth_stencil_buffer, rsx::surface_depth_format depth_format, size_t width, size_t height)
|
||||
{
|
||||
std::vector<u8> result(width * height * 4);
|
||||
|
||||
@ -145,7 +170,7 @@ struct gl_render_target_traits
|
||||
return result;
|
||||
}
|
||||
|
||||
static std::vector<u8> issue_stencil_download_command(gl::texture* depth_stencil_buffer, size_t width, size_t height)
|
||||
static std::vector<u8> issue_stencil_download_command(gl::render_target* depth_stencil_buffer, size_t width, size_t height)
|
||||
{
|
||||
std::vector<u8> result(width * height * 4);
|
||||
return result;
|
||||
@ -162,7 +187,7 @@ struct gl_render_target_traits
|
||||
{
|
||||
}
|
||||
|
||||
static gl::texture* get(const std::unique_ptr<gl::texture> &in)
|
||||
static gl::render_target* get(const std::unique_ptr<gl::render_target> &in)
|
||||
{
|
||||
return in.get();
|
||||
}
|
||||
|
@ -44,8 +44,8 @@ namespace vk
|
||||
result.host_visible_coherent = VK_MAX_MEMORY_TYPES;
|
||||
|
||||
bool host_visible_cached = false;
|
||||
u32 host_visible_vram_size = 0;
|
||||
u32 device_local_vram_size = 0;
|
||||
VkDeviceSize host_visible_vram_size = 0;
|
||||
VkDeviceSize device_local_vram_size = 0;
|
||||
|
||||
for (u32 i = 0; i < memory_properties.memoryTypeCount; i++)
|
||||
{
|
||||
|
@ -124,7 +124,7 @@ namespace vk
|
||||
vkGetPhysicalDeviceQueueFamilyProperties(dev, &count, queue_props.data());
|
||||
}
|
||||
|
||||
if (queue >= queue_props.size()) throw EXCEPTION("Undefined trap");
|
||||
if (queue >= queue_props.size()) throw EXCEPTION("Bad queue index passed to get_queue_properties (%u)", queue);
|
||||
return queue_props[queue];
|
||||
}
|
||||
|
||||
@ -154,8 +154,6 @@ namespace vk
|
||||
|
||||
render_device(vk::physical_device &pdev, uint32_t graphics_queue_idx)
|
||||
{
|
||||
VkResult err;
|
||||
|
||||
float queue_priorities[1] = { 0.f };
|
||||
pgpu = &pdev;
|
||||
|
||||
@ -188,8 +186,7 @@ namespace vk
|
||||
device.ppEnabledExtensionNames = requested_extensions;
|
||||
device.pEnabledFeatures = nullptr;
|
||||
|
||||
err = vkCreateDevice(*pgpu, &device, nullptr, &dev);
|
||||
if (err != VK_SUCCESS) throw EXCEPTION("Undefined trap");
|
||||
CHECK_RESULT(vkCreateDevice(*pgpu, &device, nullptr, &dev));
|
||||
}
|
||||
|
||||
~render_device()
|
||||
@ -844,7 +841,7 @@ namespace vk
|
||||
nb_swap_images = 0;
|
||||
getSwapchainImagesKHR(dev, m_vk_swapchain, &nb_swap_images, nullptr);
|
||||
|
||||
if (!nb_swap_images) throw EXCEPTION("Undefined trap");
|
||||
if (!nb_swap_images) throw EXCEPTION("Driver returned 0 images for swapchain");
|
||||
|
||||
std::vector<VkImage> swap_images;
|
||||
swap_images.resize(nb_swap_images);
|
||||
@ -1052,9 +1049,7 @@ namespace vk
|
||||
instance_info.ppEnabledExtensionNames = requested_extensions;
|
||||
|
||||
VkInstance instance;
|
||||
VkResult error = vkCreateInstance(&instance_info, nullptr, &instance);
|
||||
|
||||
if (error != VK_SUCCESS) throw EXCEPTION("Undefined trap");
|
||||
CHECK_RESULT(vkCreateInstance(&instance_info, nullptr, &instance));
|
||||
|
||||
m_vk_instances.push_back(instance);
|
||||
return (u32)m_vk_instances.size();
|
||||
@ -1063,7 +1058,7 @@ namespace vk
|
||||
void makeCurrentInstance(uint32_t instance_id)
|
||||
{
|
||||
if (!instance_id || instance_id > m_vk_instances.size())
|
||||
throw EXCEPTION("Undefined trap");
|
||||
throw EXCEPTION("Invalid instance passed to makeCurrentInstance (%u)", instance_id);
|
||||
|
||||
if (m_debugger)
|
||||
{
|
||||
@ -1083,7 +1078,7 @@ namespace vk
|
||||
VkInstance getInstanceById(uint32_t instance_id)
|
||||
{
|
||||
if (!instance_id || instance_id > m_vk_instances.size())
|
||||
throw EXCEPTION("Undefined trap");
|
||||
throw EXCEPTION("Invalid instance passed to getInstanceById (%u)", instance_id);
|
||||
|
||||
instance_id--;
|
||||
return m_vk_instances[instance_id];
|
||||
@ -1117,7 +1112,7 @@ namespace vk
|
||||
createInfo.hwnd = hWnd;
|
||||
|
||||
VkSurfaceKHR surface;
|
||||
VkResult err = vkCreateWin32SurfaceKHR(m_instance, &createInfo, NULL, &surface);
|
||||
CHECK_RESULT(vkCreateWin32SurfaceKHR(m_instance, &createInfo, NULL, &surface));
|
||||
|
||||
uint32_t device_queues = dev.get_queue_count();
|
||||
std::vector<VkBool32> supportsPresent(device_queues);
|
||||
@ -1165,19 +1160,17 @@ namespace vk
|
||||
|
||||
// Generate error if could not find both a graphics and a present queue
|
||||
if (graphicsQueueNodeIndex == UINT32_MAX || presentQueueNodeIndex == UINT32_MAX)
|
||||
throw EXCEPTION("Undefined trap");
|
||||
throw EXCEPTION("Failed to find a suitable graphics/compute queue");
|
||||
|
||||
if (graphicsQueueNodeIndex != presentQueueNodeIndex)
|
||||
throw EXCEPTION("Undefined trap");
|
||||
throw EXCEPTION("Separate graphics and present queues not supported");
|
||||
|
||||
// Get the list of VkFormat's that are supported:
|
||||
uint32_t formatCount;
|
||||
err = vkGetPhysicalDeviceSurfaceFormatsKHR(dev, surface, &formatCount, nullptr);
|
||||
if (err != VK_SUCCESS) throw EXCEPTION("Undefined trap");
|
||||
CHECK_RESULT(vkGetPhysicalDeviceSurfaceFormatsKHR(dev, surface, &formatCount, nullptr));
|
||||
|
||||
std::vector<VkSurfaceFormatKHR> surfFormats(formatCount);
|
||||
err = vkGetPhysicalDeviceSurfaceFormatsKHR(dev, surface, &formatCount, surfFormats.data());
|
||||
if (err != VK_SUCCESS) throw EXCEPTION("Undefined trap");
|
||||
CHECK_RESULT(vkGetPhysicalDeviceSurfaceFormatsKHR(dev, surface, &formatCount, surfFormats.data()));
|
||||
|
||||
VkFormat format;
|
||||
VkColorSpaceKHR color_space;
|
||||
@ -1188,7 +1181,7 @@ namespace vk
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!formatCount) throw EXCEPTION("Undefined trap");
|
||||
if (!formatCount) throw EXCEPTION("Format count is zero!");
|
||||
format = surfFormats[0].format;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user