mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-07-31 14:35:19 +00:00
Merge branch 'main' into net2
This commit is contained in:
commit
8261185bdb
@ -40,6 +40,10 @@ public:
|
|||||||
return ORBIS_KERNEL_ERROR_EBADF;
|
return ORBIS_KERNEL_ERROR_EBADF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual size_t pwritev(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt, u64 offset) {
|
||||||
|
return ORBIS_KERNEL_ERROR_EBADF;
|
||||||
|
}
|
||||||
|
|
||||||
virtual s64 lseek(s64 offset, int whence) {
|
virtual s64 lseek(s64 offset, int whence) {
|
||||||
return ORBIS_KERNEL_ERROR_EBADF;
|
return ORBIS_KERNEL_ERROR_EBADF;
|
||||||
}
|
}
|
||||||
|
@ -877,7 +877,7 @@ s32 PS4_SYSV_ABI sceKernelGetdirentries(s32 fd, char* buf, s32 nbytes, s64* base
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
s64 PS4_SYSV_ABI posix_pwrite(s32 fd, void* buf, size_t nbytes, s64 offset) {
|
s64 PS4_SYSV_ABI posix_pwritev(s32 fd, const SceKernelIovec* iov, s32 iovcnt, s64 offset) {
|
||||||
if (offset < 0) {
|
if (offset < 0) {
|
||||||
*__Error() = POSIX_EINVAL;
|
*__Error() = POSIX_EINVAL;
|
||||||
return -1;
|
return -1;
|
||||||
@ -893,7 +893,7 @@ s64 PS4_SYSV_ABI posix_pwrite(s32 fd, void* buf, size_t nbytes, s64 offset) {
|
|||||||
std::scoped_lock lk{file->m_mutex};
|
std::scoped_lock lk{file->m_mutex};
|
||||||
|
|
||||||
if (file->type == Core::FileSys::FileType::Device) {
|
if (file->type == Core::FileSys::FileType::Device) {
|
||||||
s64 result = file->device->pwrite(buf, nbytes, offset);
|
s64 result = file->device->pwritev(iov, iovcnt, offset);
|
||||||
if (result < 0) {
|
if (result < 0) {
|
||||||
ErrSceToPosix(result);
|
ErrSceToPosix(result);
|
||||||
return -1;
|
return -1;
|
||||||
@ -908,7 +908,16 @@ s64 PS4_SYSV_ABI posix_pwrite(s32 fd, void* buf, size_t nbytes, s64 offset) {
|
|||||||
*__Error() = POSIX_EIO;
|
*__Error() = POSIX_EIO;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return file->f.WriteRaw<u8>(buf, nbytes);
|
size_t total_written = 0;
|
||||||
|
for (int i = 0; i < iovcnt; i++) {
|
||||||
|
total_written += file->f.WriteRaw<u8>(iov[i].iov_base, iov[i].iov_len);
|
||||||
|
}
|
||||||
|
return total_written;
|
||||||
|
}
|
||||||
|
|
||||||
|
s64 PS4_SYSV_ABI posix_pwrite(s32 fd, void* buf, size_t nbytes, s64 offset) {
|
||||||
|
SceKernelIovec iovec{buf, nbytes};
|
||||||
|
return posix_pwritev(fd, &iovec, 1, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
s64 PS4_SYSV_ABI sceKernelPwrite(s32 fd, void* buf, size_t nbytes, s64 offset) {
|
s64 PS4_SYSV_ABI sceKernelPwrite(s32 fd, void* buf, size_t nbytes, s64 offset) {
|
||||||
@ -920,6 +929,15 @@ s64 PS4_SYSV_ABI sceKernelPwrite(s32 fd, void* buf, size_t nbytes, s64 offset) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
s64 PS4_SYSV_ABI sceKernelPwritev(s32 fd, const SceKernelIovec* iov, s32 iovcnt, s64 offset) {
|
||||||
|
s64 result = posix_pwritev(fd, iov, iovcnt, offset);
|
||||||
|
if (result < 0) {
|
||||||
|
LOG_ERROR(Kernel_Fs, "error = {}", *__Error());
|
||||||
|
return ErrnoToSceKernelError(*__Error());
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
s32 PS4_SYSV_ABI posix_unlink(const char* path) {
|
s32 PS4_SYSV_ABI posix_unlink(const char* path) {
|
||||||
if (path == nullptr) {
|
if (path == nullptr) {
|
||||||
*__Error() = POSIX_EINVAL;
|
*__Error() = POSIX_EINVAL;
|
||||||
@ -1017,7 +1035,10 @@ void RegisterFileSystem(Core::Loader::SymbolsResolver* sym) {
|
|||||||
LIB_FUNCTION("sfKygSjIbI8", "libkernel", 1, "libkernel", 1, 1, getdirentries);
|
LIB_FUNCTION("sfKygSjIbI8", "libkernel", 1, "libkernel", 1, 1, getdirentries);
|
||||||
LIB_FUNCTION("taRWhTJFTgE", "libkernel", 1, "libkernel", 1, 1, sceKernelGetdirentries);
|
LIB_FUNCTION("taRWhTJFTgE", "libkernel", 1, "libkernel", 1, 1, sceKernelGetdirentries);
|
||||||
LIB_FUNCTION("C2kJ-byS5rM", "libkernel", 1, "libkernel", 1, 1, posix_pwrite);
|
LIB_FUNCTION("C2kJ-byS5rM", "libkernel", 1, "libkernel", 1, 1, posix_pwrite);
|
||||||
|
LIB_FUNCTION("FCcmRZhWtOk", "libScePosix", 1, "libkernel", 1, 1, posix_pwritev);
|
||||||
|
LIB_FUNCTION("FCcmRZhWtOk", "libkernel", 1, "libkernel", 1, 1, posix_pwritev);
|
||||||
LIB_FUNCTION("nKWi-N2HBV4", "libkernel", 1, "libkernel", 1, 1, sceKernelPwrite);
|
LIB_FUNCTION("nKWi-N2HBV4", "libkernel", 1, "libkernel", 1, 1, sceKernelPwrite);
|
||||||
|
LIB_FUNCTION("mBd4AfLP+u8", "libkernel", 1, "libkernel", 1, 1, sceKernelPwritev);
|
||||||
LIB_FUNCTION("AUXVxWeJU-A", "libkernel", 1, "libkernel", 1, 1, sceKernelUnlink);
|
LIB_FUNCTION("AUXVxWeJU-A", "libkernel", 1, "libkernel", 1, 1, sceKernelUnlink);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -696,14 +696,19 @@ void Rasterizer::BindTextures(const Shader::Info& stage, Shader::Backend::Bindin
|
|||||||
|
|
||||||
void Rasterizer::BeginRendering(const GraphicsPipeline& pipeline, RenderState& state) {
|
void Rasterizer::BeginRendering(const GraphicsPipeline& pipeline, RenderState& state) {
|
||||||
int cb_index = 0;
|
int cb_index = 0;
|
||||||
for (auto& [image_id, desc] : cb_descs) {
|
for (auto attach_idx = 0u; attach_idx < state.num_color_attachments; ++attach_idx) {
|
||||||
|
if (state.color_attachments[attach_idx].imageView == VK_NULL_HANDLE) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto& [image_id, desc] = cb_descs[cb_index++];
|
||||||
if (auto& old_img = texture_cache.GetImage(image_id); old_img.binding.needs_rebind) {
|
if (auto& old_img = texture_cache.GetImage(image_id); old_img.binding.needs_rebind) {
|
||||||
auto& view = texture_cache.FindRenderTarget(desc);
|
auto& view = texture_cache.FindRenderTarget(desc);
|
||||||
ASSERT(view.image_id != image_id);
|
ASSERT(view.image_id != image_id);
|
||||||
image_id = bound_images.emplace_back(view.image_id);
|
image_id = bound_images.emplace_back(view.image_id);
|
||||||
auto& image = texture_cache.GetImage(view.image_id);
|
auto& image = texture_cache.GetImage(view.image_id);
|
||||||
state.color_attachments[cb_index].imageView = *view.image_view;
|
state.color_attachments[attach_idx].imageView = *view.image_view;
|
||||||
state.color_attachments[cb_index].imageLayout = image.last_state.layout;
|
state.color_attachments[attach_idx].imageLayout = image.last_state.layout;
|
||||||
|
|
||||||
const auto mip = view.info.range.base.level;
|
const auto mip = view.info.range.base.level;
|
||||||
state.width = std::min<u32>(state.width, std::max(image.info.size.width >> mip, 1u));
|
state.width = std::min<u32>(state.width, std::max(image.info.size.width >> mip, 1u));
|
||||||
@ -722,8 +727,7 @@ void Rasterizer::BeginRendering(const GraphicsPipeline& pipeline, RenderState& s
|
|||||||
desc.view_info.range);
|
desc.view_info.range);
|
||||||
}
|
}
|
||||||
image.usage.render_target = 1u;
|
image.usage.render_target = 1u;
|
||||||
state.color_attachments[cb_index].imageLayout = image.last_state.layout;
|
state.color_attachments[attach_idx].imageLayout = image.last_state.layout;
|
||||||
++cb_index;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (db_desc) {
|
if (db_desc) {
|
||||||
|
Loading…
Reference in New Issue
Block a user