early-access version 2550
This commit is contained in:
parent
f1141cfd5d
commit
23843c27a8
4 changed files with 16 additions and 86 deletions
|
@ -1,7 +1,7 @@
|
||||||
yuzu emulator early access
|
yuzu emulator early access
|
||||||
=============
|
=============
|
||||||
|
|
||||||
This is the source code for early-access 2547.
|
This is the source code for early-access 2550.
|
||||||
|
|
||||||
## Legal Notice
|
## Legal Notice
|
||||||
|
|
||||||
|
|
|
@ -196,7 +196,7 @@ void Maxwell3D::ProcessMethodCall(u32 method, u32 argument, u32 nonshadow_argume
|
||||||
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 13:
|
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 13:
|
||||||
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 14:
|
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 14:
|
||||||
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 15:
|
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 15:
|
||||||
return StartCBData(method);
|
return ProcessCBData(argument);
|
||||||
case MAXWELL3D_REG_INDEX(cb_bind[0]):
|
case MAXWELL3D_REG_INDEX(cb_bind[0]):
|
||||||
return ProcessCBBind(0);
|
return ProcessCBBind(0);
|
||||||
case MAXWELL3D_REG_INDEX(cb_bind[1]):
|
case MAXWELL3D_REG_INDEX(cb_bind[1]):
|
||||||
|
@ -257,14 +257,6 @@ void Maxwell3D::CallMacroMethod(u32 method, const std::vector<u32>& parameters)
|
||||||
}
|
}
|
||||||
|
|
||||||
void Maxwell3D::CallMethod(u32 method, u32 method_argument, bool is_last_call) {
|
void Maxwell3D::CallMethod(u32 method, u32 method_argument, bool is_last_call) {
|
||||||
if (method == cb_data_state.current) {
|
|
||||||
regs.reg_array[method] = method_argument;
|
|
||||||
ProcessCBData(method_argument);
|
|
||||||
return;
|
|
||||||
} else if (cb_data_state.current != null_cb_data) {
|
|
||||||
FinishCBData();
|
|
||||||
}
|
|
||||||
|
|
||||||
// It is an error to write to a register other than the current macro's ARG register before it
|
// It is an error to write to a register other than the current macro's ARG register before it
|
||||||
// has finished execution.
|
// has finished execution.
|
||||||
if (executing_macro != 0) {
|
if (executing_macro != 0) {
|
||||||
|
@ -311,7 +303,7 @@ void Maxwell3D::CallMultiMethod(u32 method, const u32* base_start, u32 amount,
|
||||||
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 13:
|
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 13:
|
||||||
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 14:
|
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 14:
|
||||||
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 15:
|
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 15:
|
||||||
ProcessCBMultiData(method, base_start, amount);
|
ProcessCBMultiData(base_start, amount);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
for (std::size_t i = 0; i < amount; i++) {
|
for (std::size_t i = 0; i < amount; i++) {
|
||||||
|
@ -629,46 +621,7 @@ void Maxwell3D::ProcessCBBind(size_t stage_index) {
|
||||||
rasterizer->BindGraphicsUniformBuffer(stage_index, bind_data.index, gpu_addr, size);
|
rasterizer->BindGraphicsUniformBuffer(stage_index, bind_data.index, gpu_addr, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Maxwell3D::ProcessCBData(u32 value) {
|
void Maxwell3D::ProcessCBMultiData(const u32* start_base, u32 amount) {
|
||||||
const u32 id = cb_data_state.id;
|
|
||||||
cb_data_state.buffer[id][cb_data_state.counter] = value;
|
|
||||||
// Increment the current buffer position.
|
|
||||||
regs.const_buffer.cb_pos = regs.const_buffer.cb_pos + 4;
|
|
||||||
cb_data_state.counter++;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Maxwell3D::StartCBData(u32 method) {
|
|
||||||
constexpr u32 first_cb_data = MAXWELL3D_REG_INDEX(const_buffer.cb_data);
|
|
||||||
cb_data_state.start_pos = regs.const_buffer.cb_pos;
|
|
||||||
cb_data_state.id = method - first_cb_data;
|
|
||||||
cb_data_state.current = method;
|
|
||||||
cb_data_state.counter = 0;
|
|
||||||
ProcessCBData(regs.const_buffer.cb_data[cb_data_state.id]);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Maxwell3D::ProcessCBMultiData(u32 method, const u32* start_base, u32 amount) {
|
|
||||||
if (cb_data_state.current != method) {
|
|
||||||
if (cb_data_state.current != null_cb_data) {
|
|
||||||
FinishCBData();
|
|
||||||
}
|
|
||||||
constexpr u32 first_cb_data = MAXWELL3D_REG_INDEX(const_buffer.cb_data);
|
|
||||||
cb_data_state.start_pos = regs.const_buffer.cb_pos;
|
|
||||||
cb_data_state.id = method - first_cb_data;
|
|
||||||
cb_data_state.current = method;
|
|
||||||
cb_data_state.counter = 0;
|
|
||||||
}
|
|
||||||
const std::size_t id = cb_data_state.id;
|
|
||||||
const std::size_t size = amount;
|
|
||||||
std::size_t i = 0;
|
|
||||||
for (; i < size; i++) {
|
|
||||||
cb_data_state.buffer[id][cb_data_state.counter] = start_base[i];
|
|
||||||
cb_data_state.counter++;
|
|
||||||
}
|
|
||||||
// Increment the current buffer position.
|
|
||||||
regs.const_buffer.cb_pos = regs.const_buffer.cb_pos + 4 * amount;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Maxwell3D::FinishCBData() {
|
|
||||||
// Write the input value to the current const buffer at the current position.
|
// Write the input value to the current const buffer at the current position.
|
||||||
const GPUVAddr buffer_address = regs.const_buffer.BufferAddress();
|
const GPUVAddr buffer_address = regs.const_buffer.BufferAddress();
|
||||||
ASSERT(buffer_address != 0);
|
ASSERT(buffer_address != 0);
|
||||||
|
@ -676,14 +629,16 @@ void Maxwell3D::FinishCBData() {
|
||||||
// Don't allow writing past the end of the buffer.
|
// Don't allow writing past the end of the buffer.
|
||||||
ASSERT(regs.const_buffer.cb_pos <= regs.const_buffer.cb_size);
|
ASSERT(regs.const_buffer.cb_pos <= regs.const_buffer.cb_size);
|
||||||
|
|
||||||
const GPUVAddr address{buffer_address + cb_data_state.start_pos};
|
const GPUVAddr address{buffer_address + regs.const_buffer.cb_pos};
|
||||||
const std::size_t size = regs.const_buffer.cb_pos - cb_data_state.start_pos;
|
const size_t copy_size = amount * sizeof(u32);
|
||||||
|
memory_manager.WriteBlock(address, start_base, copy_size);
|
||||||
|
|
||||||
const u32 id = cb_data_state.id;
|
// Increment the current buffer position.
|
||||||
memory_manager.WriteBlock(address, cb_data_state.buffer[id].data(), size);
|
regs.const_buffer.cb_pos += static_cast<u32>(copy_size);
|
||||||
|
}
|
||||||
|
|
||||||
cb_data_state.id = null_cb_data;
|
void Maxwell3D::ProcessCBData(u32 value) {
|
||||||
cb_data_state.current = null_cb_data;
|
ProcessCBMultiData(&value, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
Texture::TICEntry Maxwell3D::GetTICEntry(u32 tic_index) const {
|
Texture::TICEntry Maxwell3D::GetTICEntry(u32 tic_index) const {
|
||||||
|
|
|
@ -1545,10 +1545,8 @@ private:
|
||||||
void ProcessSyncPoint();
|
void ProcessSyncPoint();
|
||||||
|
|
||||||
/// Handles a write to the CB_DATA[i] register.
|
/// Handles a write to the CB_DATA[i] register.
|
||||||
void StartCBData(u32 method);
|
|
||||||
void ProcessCBData(u32 value);
|
void ProcessCBData(u32 value);
|
||||||
void ProcessCBMultiData(u32 method, const u32* start_base, u32 amount);
|
void ProcessCBMultiData(const u32* start_base, u32 amount);
|
||||||
void FinishCBData();
|
|
||||||
|
|
||||||
/// Handles a write to the CB_BIND register.
|
/// Handles a write to the CB_BIND register.
|
||||||
void ProcessCBBind(size_t stage_index);
|
void ProcessCBBind(size_t stage_index);
|
||||||
|
@ -1583,17 +1581,6 @@ private:
|
||||||
/// Interpreter for the macro codes uploaded to the GPU.
|
/// Interpreter for the macro codes uploaded to the GPU.
|
||||||
std::unique_ptr<MacroEngine> macro_engine;
|
std::unique_ptr<MacroEngine> macro_engine;
|
||||||
|
|
||||||
static constexpr u32 null_cb_data = 0xFFFFFFFF;
|
|
||||||
struct CBDataState {
|
|
||||||
static constexpr size_t inline_size = 0x4000;
|
|
||||||
std::array<std::array<u32, inline_size>, 16> buffer;
|
|
||||||
u32 current{null_cb_data};
|
|
||||||
u32 id{null_cb_data};
|
|
||||||
u32 start_pos{};
|
|
||||||
u32 counter{};
|
|
||||||
};
|
|
||||||
CBDataState cb_data_state;
|
|
||||||
|
|
||||||
Upload::State upload_state;
|
Upload::State upload_state;
|
||||||
|
|
||||||
bool execute_on{true};
|
bool execute_on{true};
|
||||||
|
|
|
@ -369,7 +369,7 @@ template <bool has_blacklists>
|
||||||
void TextureCache<P>::FillImageViews(DescriptorTable<TICEntry>& table,
|
void TextureCache<P>::FillImageViews(DescriptorTable<TICEntry>& table,
|
||||||
std::span<ImageViewId> cached_image_view_ids,
|
std::span<ImageViewId> cached_image_view_ids,
|
||||||
std::span<ImageViewInOut> views) {
|
std::span<ImageViewInOut> views) {
|
||||||
bool has_blacklisted;
|
bool has_blacklisted = false;
|
||||||
do {
|
do {
|
||||||
has_deleted_images = false;
|
has_deleted_images = false;
|
||||||
if constexpr (has_blacklists) {
|
if constexpr (has_blacklists) {
|
||||||
|
@ -1763,7 +1763,7 @@ void TextureCache<P>::SynchronizeAliases(ImageId image_id) {
|
||||||
});
|
});
|
||||||
const auto& resolution = Settings::values.resolution_info;
|
const auto& resolution = Settings::values.resolution_info;
|
||||||
for (const AliasedImage* const aliased : aliased_images) {
|
for (const AliasedImage* const aliased : aliased_images) {
|
||||||
if (!resolution.active | !any_rescaled) {
|
if (!resolution.active || !any_rescaled) {
|
||||||
CopyImage(image_id, aliased->id, aliased->copies);
|
CopyImage(image_id, aliased->id, aliased->copies);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -1774,19 +1774,7 @@ void TextureCache<P>::SynchronizeAliases(ImageId image_id) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
ScaleUp(aliased_image);
|
ScaleUp(aliased_image);
|
||||||
|
CopyImage(image_id, aliased->id, aliased->copies);
|
||||||
const bool both_2d{image.info.type == ImageType::e2D &&
|
|
||||||
aliased_image.info.type == ImageType::e2D};
|
|
||||||
auto copies = aliased->copies;
|
|
||||||
for (auto copy : copies) {
|
|
||||||
copy.extent.width = std::max<u32>(
|
|
||||||
(copy.extent.width * resolution.up_scale) >> resolution.down_shift, 1);
|
|
||||||
if (both_2d) {
|
|
||||||
copy.extent.height = std::max<u32>(
|
|
||||||
(copy.extent.height * resolution.up_scale) >> resolution.down_shift, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
CopyImage(image_id, aliased->id, copies);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue