rsx: Several fixes and improvements

- Do not ignore non-centered pixel blitting
- Register method ac00+16
- Bump texture memory heap to account for GPU texture scaling requirements (vulkan)
- Explicit MRT location index output to better convey intent (openGL)
This commit is contained in:
kd-11 2017-09-04 12:53:17 +03:00
parent deb590cb05
commit 73312fc363
4 changed files with 26 additions and 17 deletions

View File

@ -88,7 +88,7 @@ void GLFragmentDecompilerThread::insertOutputs(std::stringstream & OS)
for (int i = 0; i < sizeof(table) / sizeof(*table); ++i)
{
if (m_parr.HasParam(PF_PARAM_NONE, "vec4", table[i].second))
OS << "out vec4 " << table[i].first << ";\n";
OS << "layout(location=" << i << ") out vec4 " << table[i].first << ";\n";
}
}

View File

@ -29,7 +29,7 @@ namespace vk
#define VK_ATTRIB_RING_BUFFER_SIZE_M 256
#define VK_UBO_RING_BUFFER_SIZE_M 64
#define VK_INDEX_RING_BUFFER_SIZE_M 64
#define VK_TEXTURE_UPLOAD_RING_BUFFER_SIZE_M 64
#define VK_TEXTURE_UPLOAD_RING_BUFFER_SIZE_M 128
#define VK_MAX_ASYNC_CB_COUNT 64
#define VK_MAX_ASYNC_FRAMES 2

View File

@ -12,6 +12,7 @@ namespace rsx
struct blit_src_info
{
blit_engine::transfer_source_format format;
blit_engine::transfer_origin origin;
u16 offset_x;
u16 offset_y;
u16 width;

View File

@ -539,10 +539,16 @@ namespace rsx
u16 in_pitch = method_registers.blit_engine_input_pitch();
if (in_w == 0 || in_h == 0 || out_w == 0 || out_h == 0)
{
LOG_ERROR(RSX, "NV3089_IMAGE_IN_SIZE: Invalid blit dimensions passed");
return;
}
if (in_origin != blit_engine::transfer_origin::corner)
{
LOG_ERROR(RSX, "NV3089_IMAGE_IN_SIZE: unknown origin (%d)", (u8)in_origin);
return;
// Probably refers to texel geometry which would affect clipping algorithm slightly when rounding texel addresses
LOG_WARNING(RSX, "NV3089_IMAGE_IN_SIZE: unknown origin (%d)", (u8)in_origin);
}
if (operation != rsx::blit_engine::transfer_operation::srccopy)
@ -613,25 +619,12 @@ namespace rsx
LOG_ERROR(RSX, "NV3089_IMAGE_IN_SIZE: unknown src_color_format (%d)", (u8)src_color_format);
}
std::unique_ptr<u8[]> temp1, temp2, sw_temp;
AVPixelFormat in_format = (src_color_format == rsx::blit_engine::transfer_source_format::r5g6b5) ? AV_PIX_FMT_RGB565BE : AV_PIX_FMT_ARGB;
AVPixelFormat out_format = (dst_color_format == rsx::blit_engine::transfer_destination_format::r5g6b5) ? AV_PIX_FMT_RGB565BE : AV_PIX_FMT_ARGB;
f32 scale_x = 1048576.f / method_registers.blit_engine_ds_dx();
f32 scale_y = 1048576.f / method_registers.blit_engine_dt_dy();
u32 convert_w = (u32)(scale_x * in_w);
u32 convert_h = (u32)(scale_y * in_h);
bool need_clip =
clip_w != in_w ||
clip_h != in_h ||
clip_x > 0 || clip_y > 0 ||
convert_w != out_w || convert_h != out_h;
bool need_convert = out_format != in_format || scale_x != 1.0 || scale_y != 1.0;
u32 slice_h = clip_h;
if (src_region.tile)
@ -659,6 +652,7 @@ namespace rsx
blit_dst_info dst_info;
src_info.format = src_color_format;
src_info.origin = in_origin;
src_info.width = in_w;
src_info.height = in_h;
src_info.pitch = in_pitch;
@ -686,6 +680,19 @@ namespace rsx
return;
}
std::unique_ptr<u8[]> temp1, temp2, sw_temp;
const AVPixelFormat in_format = (src_color_format == rsx::blit_engine::transfer_source_format::r5g6b5) ? AV_PIX_FMT_RGB565BE : AV_PIX_FMT_ARGB;
const AVPixelFormat out_format = (dst_color_format == rsx::blit_engine::transfer_destination_format::r5g6b5) ? AV_PIX_FMT_RGB565BE : AV_PIX_FMT_ARGB;
const bool need_clip =
clip_w != in_w ||
clip_h != in_h ||
clip_x > 0 || clip_y > 0 ||
convert_w != out_w || convert_h != out_h;
const bool need_convert = out_format != in_format || scale_x != 1.0 || scale_y != 1.0;
if (method_registers.blit_engine_context_surface() != blit_engine::context_surface::swizzle2d)
{
if (need_convert || need_clip)
@ -1458,6 +1465,7 @@ namespace rsx
bind_array<NV4097_SET_VERTEX_DATA4F_M, 1, 64, nullptr>();
bind_array<NV4097_SET_VERTEX_DATA1F_M, 1, 16, nullptr>();
bind_array<NV4097_SET_COLOR_KEY_COLOR, 1, 16, nullptr>();
bind_array<(0xac00 >> 2), 1, 16, nullptr>(); // Unknown texture control register
// NV406E
bind<NV406E_SET_REFERENCE, nv406e::set_reference>();