summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar bunnei2018-01-21 17:56:06 -0500
committerGravatar GitHub2018-01-21 17:56:06 -0500
commit2403143ff13b67d0fd63c56f45f8a5d395cd5bb9 (patch)
tree540c43ecf8997e3f2bbff7db29ac5ed6e6df1790 /src
parentMerge pull request #123 from bunnei/fs (diff)
parentVI: Implement the Query transaction of IHOSBinderDriver, and stubbed some res... (diff)
downloadyuzu-2403143ff13b67d0fd63c56f45f8a5d395cd5bb9.tar.gz
yuzu-2403143ff13b67d0fd63c56f45f8a5d395cd5bb9.tar.xz
yuzu-2403143ff13b67d0fd63c56f45f8a5d395cd5bb9.zip
Merge pull request #128 from Subv/parcel_query
VI: Implement the Query transaction of IHOSBinderDriver, and stubbed some results.
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/service/vi/vi.cpp51
-rw-r--r--src/core/hle/service/vi/vi.h7
2 files changed, 58 insertions, 0 deletions
diff --git a/src/core/hle/service/vi/vi.cpp b/src/core/hle/service/vi/vi.cpp
index c624e734e..3f2fd72b2 100644
--- a/src/core/hle/service/vi/vi.cpp
+++ b/src/core/hle/service/vi/vi.cpp
@@ -356,6 +356,35 @@ private:
356 Data data{}; 356 Data data{};
357}; 357};
358 358
359class IGBPQueryRequestParcel : public Parcel {
360public:
361 explicit IGBPQueryRequestParcel(const std::vector<u8>& buffer) : Parcel(buffer) {
362 Deserialize();
363 }
364 ~IGBPQueryRequestParcel() override = default;
365
366 void DeserializeData() override {
367 std::u16string token = ReadInterfaceToken();
368 type = Read<u32_le>();
369 }
370
371 u32 type;
372};
373
374class IGBPQueryResponseParcel : public Parcel {
375public:
376 explicit IGBPQueryResponseParcel(u32 value) : Parcel(), value(value) {}
377 ~IGBPQueryResponseParcel() override = default;
378
379protected:
380 void SerializeData() override {
381 Write(value);
382 }
383
384private:
385 u32_le value;
386};
387
359class IHOSBinderDriver final : public ServiceFramework<IHOSBinderDriver> { 388class IHOSBinderDriver final : public ServiceFramework<IHOSBinderDriver> {
360public: 389public:
361 explicit IHOSBinderDriver(std::shared_ptr<NVFlinger> nv_flinger) 390 explicit IHOSBinderDriver(std::shared_ptr<NVFlinger> nv_flinger)
@@ -445,6 +474,15 @@ private:
445 auto response_buffer = response.Serialize(); 474 auto response_buffer = response.Serialize();
446 Memory::WriteBlock(output_buffer.Address(), response_buffer.data(), 475 Memory::WriteBlock(output_buffer.Address(), response_buffer.data(),
447 output_buffer.Size()); 476 output_buffer.Size());
477 } else if (transaction == TransactionId::Query) {
478 IGBPQueryRequestParcel request{input_data};
479
480 u32 value = buffer_queue->Query(static_cast<BufferQueue::QueryType>(request.type));
481
482 IGBPQueryResponseParcel response{value};
483 auto response_buffer = response.Serialize();
484 Memory::WriteBlock(output_buffer.Address(), response_buffer.data(),
485 output_buffer.Size());
448 } else { 486 } else {
449 ASSERT_MSG(false, "Unimplemented"); 487 ASSERT_MSG(false, "Unimplemented");
450 } 488 }
@@ -918,6 +956,19 @@ void BufferQueue::ReleaseBuffer(u32 slot) {
918 itr->status = Buffer::Status::Free; 956 itr->status = Buffer::Status::Free;
919} 957}
920 958
959u32 BufferQueue::Query(QueryType type) {
960 LOG_WARNING(Service, "(STUBBED) called type=%u", static_cast<u32>(type));
961 switch (type) {
962 case QueryType::NativeWindowFormat:
963 // TODO(Subv): Use an enum for this
964 static constexpr u32 FormatABGR8 = 1;
965 return FormatABGR8;
966 }
967
968 UNIMPLEMENTED();
969 return 0;
970}
971
921Layer::Layer(u64 id, std::shared_ptr<BufferQueue> queue) : id(id), buffer_queue(std::move(queue)) {} 972Layer::Layer(u64 id, std::shared_ptr<BufferQueue> queue) : id(id), buffer_queue(std::move(queue)) {}
922 973
923Display::Display(u64 id, std::string name) : id(id), name(std::move(name)) { 974Display::Display(u64 id, std::string name) : id(id), name(std::move(name)) {
diff --git a/src/core/hle/service/vi/vi.h b/src/core/hle/service/vi/vi.h
index 81d4f3daa..4dd4d1783 100644
--- a/src/core/hle/service/vi/vi.h
+++ b/src/core/hle/service/vi/vi.h
@@ -37,6 +37,12 @@ static_assert(sizeof(IGBPBuffer) == 0x16C, "IGBPBuffer has wrong size");
37 37
38class BufferQueue { 38class BufferQueue {
39public: 39public:
40 enum class QueryType {
41 NativeWindowWidth = 0,
42 NativeWindowHeight = 1,
43 NativeWindowFormat = 2,
44 };
45
40 BufferQueue(u32 id, u64 layer_id); 46 BufferQueue(u32 id, u64 layer_id);
41 ~BufferQueue() = default; 47 ~BufferQueue() = default;
42 48
@@ -54,6 +60,7 @@ public:
54 void QueueBuffer(u32 slot); 60 void QueueBuffer(u32 slot);
55 boost::optional<const Buffer&> AcquireBuffer(); 61 boost::optional<const Buffer&> AcquireBuffer();
56 void ReleaseBuffer(u32 slot); 62 void ReleaseBuffer(u32 slot);
63 u32 Query(QueryType type);
57 64
58 u32 GetId() const { 65 u32 GetId() const {
59 return id; 66 return id;