diff options
| author | 2020-04-06 13:34:06 +0700 | |
|---|---|---|
| committer | 2020-04-06 13:34:06 +0700 | |
| commit | 9efa51311f1d5cbd4300c23623f4bc8aed88f9a9 (patch) | |
| tree | 75c92d5203d079ab3b2eef2cb180818395c3c5af /src | |
| parent | shader_decode: SULD.D fix conversion error. (diff) | |
| download | yuzu-9efa51311f1d5cbd4300c23623f4bc8aed88f9a9.tar.gz yuzu-9efa51311f1d5cbd4300c23623f4bc8aed88f9a9.tar.xz yuzu-9efa51311f1d5cbd4300c23623f4bc8aed88f9a9.zip | |
shader_decode: SULD.D avoid duplicate code block.
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/shader/decode/image.cpp | 41 |
1 files changed, 2 insertions, 39 deletions
diff --git a/src/video_core/shader/decode/image.cpp b/src/video_core/shader/decode/image.cpp index 96e8db618..242cd6cc1 100644 --- a/src/video_core/shader/decode/image.cpp +++ b/src/video_core/shader/decode/image.cpp | |||
| @@ -272,7 +272,7 @@ std::size_t GetImageTypeNumCoordinates(Tegra::Shader::ImageType image_type) { | |||
| 272 | } // Anonymous namespace | 272 | } // Anonymous namespace |
| 273 | 273 | ||
| 274 | Node ShaderIR::GetComponentValue(ComponentType component_type, u32 component_size, | 274 | Node ShaderIR::GetComponentValue(ComponentType component_type, u32 component_size, |
| 275 | const Node original_value, bool* is_signed) { | 275 | Node original_value, bool* is_signed) { |
| 276 | switch (component_type) { | 276 | switch (component_type) { |
| 277 | case ComponentType::SNORM: { | 277 | case ComponentType::SNORM: { |
| 278 | *is_signed = true; | 278 | *is_signed = true; |
| @@ -366,38 +366,7 @@ u32 ShaderIR::DecodeImage(NodeBlock& bb, u32 pc) { | |||
| 366 | const auto comp_mask = GetImageComponentMask(descriptor.format); | 366 | const auto comp_mask = GetImageComponentMask(descriptor.format); |
| 367 | 367 | ||
| 368 | switch (instr.suldst.GetStoreDataLayout()) { | 368 | switch (instr.suldst.GetStoreDataLayout()) { |
| 369 | case StoreType::Bits32: { | 369 | case StoreType::Bits32: |
| 370 | u32 shifted_counter = 0; | ||
| 371 | Node value = Immediate(0); | ||
| 372 | for (u32 element = 0; element < 4; ++element) { | ||
| 373 | if (!IsComponentEnabled(comp_mask, element)) { | ||
| 374 | continue; | ||
| 375 | } | ||
| 376 | const auto component_type = GetComponentType(descriptor, element); | ||
| 377 | const auto component_size = GetComponentSize(descriptor.format, element); | ||
| 378 | bool is_signed = true; | ||
| 379 | MetaImage meta{image, {}, element}; | ||
| 380 | |||
| 381 | Node converted_value = GetComponentValue( | ||
| 382 | component_type, component_size, | ||
| 383 | Operation(OperationCode::ImageLoad, meta, GetCoordinates(type)), | ||
| 384 | &is_signed); | ||
| 385 | |||
| 386 | // shift element to correct position | ||
| 387 | const auto shifted = shifted_counter; | ||
| 388 | if (shifted > 0) { | ||
| 389 | converted_value = | ||
| 390 | SignedOperation(OperationCode::ILogicalShiftLeft, is_signed, | ||
| 391 | std::move(converted_value), Immediate(shifted)); | ||
| 392 | } | ||
| 393 | shifted_counter += component_size; | ||
| 394 | |||
| 395 | // add value into result | ||
| 396 | value = Operation(OperationCode::UBitwiseOr, value, std::move(converted_value)); | ||
| 397 | } | ||
| 398 | SetRegister(bb, instr.gpr0.Value(), std::move(value)); | ||
| 399 | break; | ||
| 400 | } | ||
| 401 | case StoreType::Bits64: { | 370 | case StoreType::Bits64: { |
| 402 | u32 indexer = 0; | 371 | u32 indexer = 0; |
| 403 | u32 shifted_counter = 0; | 372 | u32 shifted_counter = 0; |
| @@ -432,12 +401,6 @@ u32 ShaderIR::DecodeImage(NodeBlock& bb, u32 pc) { | |||
| 432 | // if we shifted enough for 1 byte -> we save it into temp | 401 | // if we shifted enough for 1 byte -> we save it into temp |
| 433 | if (shifted_counter >= 32) { | 402 | if (shifted_counter >= 32) { |
| 434 | SetTemporary(bb, indexer++, std::move(value)); | 403 | SetTemporary(bb, indexer++, std::move(value)); |
| 435 | |||
| 436 | // we only use 2 bytes for bits64 | ||
| 437 | if (indexer >= 2) { | ||
| 438 | break; | ||
| 439 | } | ||
| 440 | |||
| 441 | // reset counter and value to prepare pack next byte | 404 | // reset counter and value to prepare pack next byte |
| 442 | value = Immediate(0); | 405 | value = Immediate(0); |
| 443 | shifted_counter = 0; | 406 | shifted_counter = 0; |