Просмотр исходного кода

hle: nvflinger: BufferQueueProducer: Handle SetPreallocatedBuffer with empty buffer.

- Used by Naruto Ultimate Ninja Storm.
bunnei 4 лет назад
Родитель
Сommit
5849c9a4cd
1 измененных файлов с 10 добавлено и 7 удалено
  1. 10 7
      src/core/hle/service/nvflinger/buffer_queue_producer.cpp

+ 10 - 7
src/core/hle/service/nvflinger/buffer_queue_producer.cpp

@@ -793,8 +793,6 @@ Status BufferQueueProducer::SetPreallocatedBuffer(s32 slot,
                                                   const std::shared_ptr<GraphicBuffer>& buffer) {
     LOG_DEBUG(Service_NVFlinger, "slot {}", slot);
 
-    UNIMPLEMENTED_IF_MSG(!buffer, "buffer must be valid!");
-
     if (slot < 0 || slot >= BufferQueueDefs::NUM_BUFFER_SLOTS) {
         return Status::BadValue;
     }
@@ -802,13 +800,18 @@ Status BufferQueueProducer::SetPreallocatedBuffer(s32 slot,
     BufferQueueCore::AutoLock lock(core);
 
     slots[slot] = {};
-    slots[slot].is_preallocated = true;
     slots[slot].graphic_buffer = buffer;
 
-    core->override_max_buffer_count = core->GetPreallocatedBufferCountLocked();
-    core->default_width = buffer->Width();
-    core->default_height = buffer->Height();
-    core->default_buffer_format = buffer->Format();
+    // Most games preallocate a buffer and pass a valid buffer here. However, it is possible for
+    // this to be called with an empty buffer, Naruto Ultimate Ninja Storm is a game that does this.
+    if (buffer) {
+        slots[slot].is_preallocated = true;
+
+        core->override_max_buffer_count = core->GetPreallocatedBufferCountLocked();
+        core->default_width = buffer->Width();
+        core->default_height = buffer->Height();
+        core->default_buffer_format = buffer->Format();
+    }
 
     core->SignalDequeueCondition();
     buffer_wait_event->GetWritableEvent().Signal();