diff options
| author | 2018-01-21 17:56:06 -0500 | |
|---|---|---|
| committer | 2018-01-21 17:56:06 -0500 | |
| commit | 2403143ff13b67d0fd63c56f45f8a5d395cd5bb9 (patch) | |
| tree | 540c43ecf8997e3f2bbff7db29ac5ed6e6df1790 /src | |
| parent | Merge pull request #123 from bunnei/fs (diff) | |
| parent | VI: Implement the Query transaction of IHOSBinderDriver, and stubbed some res... (diff) | |
| download | yuzu-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.cpp | 51 | ||||
| -rw-r--r-- | src/core/hle/service/vi/vi.h | 7 |
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 | ||
| 359 | class IGBPQueryRequestParcel : public Parcel { | ||
| 360 | public: | ||
| 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 | |||
| 374 | class IGBPQueryResponseParcel : public Parcel { | ||
| 375 | public: | ||
| 376 | explicit IGBPQueryResponseParcel(u32 value) : Parcel(), value(value) {} | ||
| 377 | ~IGBPQueryResponseParcel() override = default; | ||
| 378 | |||
| 379 | protected: | ||
| 380 | void SerializeData() override { | ||
| 381 | Write(value); | ||
| 382 | } | ||
| 383 | |||
| 384 | private: | ||
| 385 | u32_le value; | ||
| 386 | }; | ||
| 387 | |||
| 359 | class IHOSBinderDriver final : public ServiceFramework<IHOSBinderDriver> { | 388 | class IHOSBinderDriver final : public ServiceFramework<IHOSBinderDriver> { |
| 360 | public: | 389 | public: |
| 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 | ||
| 959 | u32 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 | |||
| 921 | Layer::Layer(u64 id, std::shared_ptr<BufferQueue> queue) : id(id), buffer_queue(std::move(queue)) {} | 972 | Layer::Layer(u64 id, std::shared_ptr<BufferQueue> queue) : id(id), buffer_queue(std::move(queue)) {} |
| 922 | 973 | ||
| 923 | Display::Display(u64 id, std::string name) : id(id), name(std::move(name)) { | 974 | Display::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 | ||
| 38 | class BufferQueue { | 38 | class BufferQueue { |
| 39 | public: | 39 | public: |
| 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; |