diff options
| -rw-r--r-- | PREUPLOAD.cfg | 3 | ||||
| -rw-r--r-- | cmds/installd/OWNERS | 7 | ||||
| -rw-r--r-- | cmds/servicemanager/service_manager.c | 4 | ||||
| -rw-r--r-- | libs/binder/ndk/AIBinder.cpp | 157 | ||||
| -rw-r--r-- | libs/binder/ndk/AIBinder_internal.h | 48 | ||||
| -rw-r--r-- | libs/binder/ndk/AParcel.cpp | 7 | ||||
| -rw-r--r-- | libs/binder/ndk/AServiceManager.cpp | 2 | ||||
| -rw-r--r-- | libs/binder/ndk/include_ndk/android/binder_ibinder.h | 73 | ||||
| -rw-r--r-- | libs/binder/ndk/include_ndk/android/binder_parcel.h | 12 | ||||
| -rw-r--r-- | libs/binder/ndk/include_ndk/android/binder_status.h | 11 | ||||
| -rw-r--r-- | libs/binder/ndk/test/main_client.cpp | 51 | ||||
| -rw-r--r-- | vulkan/api/vulkan.api | 99 | ||||
| -rw-r--r-- | vulkan/include/vulkan/vulkan_core.h | 97 |
13 files changed, 550 insertions, 21 deletions
diff --git a/PREUPLOAD.cfg b/PREUPLOAD.cfg new file mode 100644 index 0000000000..f8f02658fb --- /dev/null +++ b/PREUPLOAD.cfg @@ -0,0 +1,3 @@ +[Hook Scripts] +owners_hook = ${REPO_ROOT}/frameworks/base/tools/aosp/aosp_sha.sh ${PREUPLOAD_COMMIT} "OWNERS$" +installd_hook = ${REPO_ROOT}/frameworks/base/tools/aosp/aosp_sha.sh ${PREUPLOAD_COMMIT} "^cmds/installd/" diff --git a/cmds/installd/OWNERS b/cmds/installd/OWNERS new file mode 100644 index 0000000000..50440f1dae --- /dev/null +++ b/cmds/installd/OWNERS @@ -0,0 +1,7 @@ +set noparent + +calin@google.com +agampe@google.com +jsharkey@android.com +toddke@google.com +ngeoffray@google.com diff --git a/cmds/servicemanager/service_manager.c b/cmds/servicemanager/service_manager.c index 6b340a8d3a..d776682d74 100644 --- a/cmds/servicemanager/service_manager.c +++ b/cmds/servicemanager/service_manager.c @@ -403,7 +403,11 @@ int main(int argc, char** argv) cb.func_audit = audit_callback; selinux_set_callback(SELINUX_CB_AUDIT, cb); +#ifdef VENDORSERVICEMANAGER + cb.func_log = selinux_vendor_log_callback; +#else cb.func_log = selinux_log_callback; +#endif selinux_set_callback(SELINUX_CB_LOG, cb); #ifdef VENDORSERVICEMANAGER diff --git a/libs/binder/ndk/AIBinder.cpp b/libs/binder/ndk/AIBinder.cpp index 2219f8ea00..c02a77a3e1 100644 --- a/libs/binder/ndk/AIBinder.cpp +++ b/libs/binder/ndk/AIBinder.cpp @@ -22,6 +22,8 @@ #include <android-base/logging.h> +using DeathRecipient = ::android::IBinder::DeathRecipient; + using ::android::IBinder; using ::android::Parcel; using ::android::sp; @@ -32,10 +34,10 @@ namespace ABBinderTag { static const void* kId = "ABBinder"; static void* kValue = static_cast<void*>(new bool{true}); -void cleanId(const void* /*id*/, void* /*obj*/, void* /*cookie*/){/* do nothing */}; +void clean(const void* /*id*/, void* /*obj*/, void* /*cookie*/){/* do nothing */}; static void attach(const sp<IBinder>& binder) { - binder->attachObject(kId, kValue, nullptr /*cookie*/, cleanId); + binder->attachObject(kId, kValue, nullptr /*cookie*/, clean); } static bool has(const sp<IBinder>& binder) { return binder != nullptr && binder->findObject(kId) == kValue; @@ -43,6 +45,21 @@ static bool has(const sp<IBinder>& binder) { } // namespace ABBinderTag +namespace ABpBinderTag { + +static std::mutex gLock; +static const void* kId = "ABpBinder"; +struct Value { + wp<ABpBinder> binder; +}; +void clean(const void* id, void* obj, void* cookie) { + CHECK(id == kId) << id << " " << obj << " " << cookie; + + delete static_cast<Value*>(obj); +}; + +} // namespace ABpBinderTag + AIBinder::AIBinder(const AIBinder_Class* clazz) : mClazz(clazz) {} AIBinder::~AIBinder() {} @@ -121,14 +138,51 @@ ABpBinder::ABpBinder(const ::android::sp<::android::IBinder>& binder) } ABpBinder::~ABpBinder() {} -sp<AIBinder> ABpBinder::fromBinder(const ::android::sp<::android::IBinder>& binder) { +void ABpBinder::onLastStrongRef(const void* id) { + { + std::lock_guard<std::mutex> lock(ABpBinderTag::gLock); + // Since ABpBinder is OBJECT_LIFETIME_WEAK, we must remove this weak reference in order for + // the ABpBinder to be deleted. Since a strong reference to this ABpBinder object should no + // longer be able to exist at the time of this method call, there is no longer a need to + // recover it. + + ABpBinderTag::Value* value = + static_cast<ABpBinderTag::Value*>(remote()->findObject(ABpBinderTag::kId)); + if (value != nullptr) { + value->binder = nullptr; + } + } + + BpRefBase::onLastStrongRef(id); +} + +sp<AIBinder> ABpBinder::lookupOrCreateFromBinder(const ::android::sp<::android::IBinder>& binder) { if (binder == nullptr) { return nullptr; } if (ABBinderTag::has(binder)) { return static_cast<ABBinder*>(binder.get()); } - return new ABpBinder(binder); + + // The following code ensures that for a given binder object (remote or local), if it is not an + // ABBinder then at most one ABpBinder object exists in a given process representing it. + std::lock_guard<std::mutex> lock(ABpBinderTag::gLock); + + ABpBinderTag::Value* value = + static_cast<ABpBinderTag::Value*>(binder->findObject(ABpBinderTag::kId)); + if (value == nullptr) { + value = new ABpBinderTag::Value; + binder->attachObject(ABpBinderTag::kId, static_cast<void*>(value), nullptr /*cookie*/, + ABpBinderTag::clean); + } + + sp<ABpBinder> ret = value->binder.promote(); + if (ret == nullptr) { + ret = new ABpBinder(binder); + value->binder = ret; + } + + return ret; } struct AIBinder_Weak { @@ -179,6 +233,63 @@ AIBinder_Class* AIBinder_Class_define(const char* interfaceDescriptor, return new AIBinder_Class(interfaceDescriptor, onCreate, onDestroy, onTransact); } +void AIBinder_DeathRecipient::TransferDeathRecipient::binderDied(const wp<IBinder>& who) { + CHECK(who == mWho); + + mOnDied(mCookie); + mWho = nullptr; +} + +AIBinder_DeathRecipient::AIBinder_DeathRecipient(AIBinder_DeathRecipient_onBinderDied onDied) + : mOnDied(onDied) { + CHECK(onDied != nullptr); +} + +binder_status_t AIBinder_DeathRecipient::linkToDeath(AIBinder* binder, void* cookie) { + CHECK(binder != nullptr); + + std::lock_guard<std::mutex> l(mDeathRecipientsMutex); + + sp<TransferDeathRecipient> recipient = + new TransferDeathRecipient(binder->getBinder(), cookie, mOnDied); + + binder_status_t status = binder->getBinder()->linkToDeath(recipient, cookie, 0 /*flags*/); + if (status != EX_NONE) { + return status; + } + + mDeathRecipients.push_back(recipient); + return EX_NONE; +} + +binder_status_t AIBinder_DeathRecipient::unlinkToDeath(AIBinder* binder, void* cookie) { + CHECK(binder != nullptr); + + std::lock_guard<std::mutex> l(mDeathRecipientsMutex); + + for (auto it = mDeathRecipients.rbegin(); it != mDeathRecipients.rend(); ++it) { + sp<TransferDeathRecipient> recipient = *it; + + if (recipient->getCookie() == cookie && + + recipient->getWho() == binder->getBinder()) { + mDeathRecipients.erase(it.base() - 1); + + binder_status_t status = + binder->getBinder()->unlinkToDeath(recipient, cookie, 0 /*flags*/); + if (status != EX_NONE) { + LOG(ERROR) << __func__ + << ": removed reference to death recipient but unlink failed."; + } + return status; + } + } + + return -ENOENT; +} + +// start of C-API methods + AIBinder* AIBinder_new(const AIBinder_Class* clazz, void* args) { if (clazz == nullptr) { LOG(ERROR) << __func__ << ": Must provide class to construct local binder."; @@ -218,6 +329,26 @@ binder_status_t AIBinder_ping(AIBinder* binder) { return binder->getBinder()->pingBinder(); } +binder_status_t AIBinder_linkToDeath(AIBinder* binder, AIBinder_DeathRecipient* recipient, + void* cookie) { + if (binder == nullptr || recipient == nullptr) { + LOG(ERROR) << __func__ << ": Must provide binder and recipient."; + return EX_NULL_POINTER; + } + + return recipient->linkToDeath(binder, cookie); +} + +binder_status_t AIBinder_unlinkToDeath(AIBinder* binder, AIBinder_DeathRecipient* recipient, + void* cookie) { + if (binder == nullptr || recipient == nullptr) { + LOG(ERROR) << __func__ << ": Must provide binder and recipient."; + return EX_NULL_POINTER; + } + + return recipient->unlinkToDeath(binder, cookie); +} + void AIBinder_incStrong(AIBinder* binder) { if (binder == nullptr) { LOG(ERROR) << __func__ << ": on null binder"; @@ -347,3 +478,21 @@ binder_status_t AIBinder_transact(AIBinder* binder, transaction_code_t code, APa return parcelStatus; } + +AIBinder_DeathRecipient* AIBinder_DeathRecipient_new( + AIBinder_DeathRecipient_onBinderDied onBinderDied) { + if (onBinderDied == nullptr) { + LOG(ERROR) << __func__ << ": requires non-null onBinderDied parameter."; + return nullptr; + } + return new AIBinder_DeathRecipient(onBinderDied); +} + +void AIBinder_DeathRecipient_delete(AIBinder_DeathRecipient** recipient) { + if (recipient == nullptr) { + return; + } + + delete *recipient; + *recipient = nullptr; +} diff --git a/libs/binder/ndk/AIBinder_internal.h b/libs/binder/ndk/AIBinder_internal.h index 23949bb034..30009d253e 100644 --- a/libs/binder/ndk/AIBinder_internal.h +++ b/libs/binder/ndk/AIBinder_internal.h @@ -20,6 +20,8 @@ #include "AIBinder_internal.h" #include <atomic> +#include <mutex> +#include <vector> #include <binder/Binder.h> #include <binder/IBinder.h> @@ -79,13 +81,18 @@ private: void* mUserData; }; -// This binder object may be remote or local (even though it is 'Bp'). It is not yet associated with -// a class. +// This binder object may be remote or local (even though it is 'Bp'). The implication if it is +// local is that it is an IBinder object created outside of the domain of libbinder_ndk. struct ABpBinder : public AIBinder, public ::android::BpRefBase { - static ::android::sp<AIBinder> fromBinder(const ::android::sp<::android::IBinder>& binder); + // Looks up to see if this object has or is an existing ABBinder or ABpBinder object, otherwise + // it creates an ABpBinder object. + static ::android::sp<AIBinder> lookupOrCreateFromBinder( + const ::android::sp<::android::IBinder>& binder); virtual ~ABpBinder(); + void onLastStrongRef(const void* id) override; + ::android::sp<::android::IBinder> getBinder() override { return remote(); } ABpBinder* asABpBinder() override { return this; } @@ -108,3 +115,38 @@ private: // one. const ::android::String16 mInterfaceDescriptor; }; + +// Ownership is like this (when linked to death): +// +// AIBinder_DeathRecipient -sp-> TransferDeathRecipient <-wp-> IBinder +// +// When the AIBinder_DeathRecipient is dropped, so are the actual underlying death recipients. When +// the IBinder dies, only a wp to it is kept. +struct AIBinder_DeathRecipient { + // One of these is created for every linkToDeath. This is to be able to recover data when a + // binderDied receipt only gives us information about the IBinder. + struct TransferDeathRecipient : ::android::IBinder::DeathRecipient { + TransferDeathRecipient(const ::android::wp<::android::IBinder>& who, void* cookie, + const AIBinder_DeathRecipient_onBinderDied& onDied) + : mWho(who), mCookie(cookie), mOnDied(onDied) {} + + void binderDied(const ::android::wp<::android::IBinder>& who) override; + + const ::android::wp<::android::IBinder>& getWho() { return mWho; } + void* getCookie() { return mCookie; } + + private: + ::android::wp<::android::IBinder> mWho; + void* mCookie; + const AIBinder_DeathRecipient_onBinderDied& mOnDied; + }; + + AIBinder_DeathRecipient(AIBinder_DeathRecipient_onBinderDied onDied); + binder_status_t linkToDeath(AIBinder* binder, void* cookie); + binder_status_t unlinkToDeath(AIBinder* binder, void* cookie); + +private: + std::mutex mDeathRecipientsMutex; + std::vector<::android::sp<TransferDeathRecipient>> mDeathRecipients; + AIBinder_DeathRecipient_onBinderDied mOnDied; +}; diff --git a/libs/binder/ndk/AParcel.cpp b/libs/binder/ndk/AParcel.cpp index 93384d64fa..f0909294bc 100644 --- a/libs/binder/ndk/AParcel.cpp +++ b/libs/binder/ndk/AParcel.cpp @@ -35,7 +35,8 @@ void AParcel_delete(AParcel** parcel) { } binder_status_t AParcel_writeStrongBinder(AParcel* parcel, AIBinder* binder) { - return (*parcel)->writeStrongBinder(binder->getBinder()); + sp<IBinder> writeBinder = binder != nullptr ? binder->getBinder() : nullptr; + return (*parcel)->writeStrongBinder(writeBinder); } binder_status_t AParcel_readStrongBinder(const AParcel* parcel, AIBinder** binder) { sp<IBinder> readBinder = nullptr; @@ -43,7 +44,7 @@ binder_status_t AParcel_readStrongBinder(const AParcel* parcel, AIBinder** binde if (status != EX_NONE) { return status; } - sp<AIBinder> ret = ABpBinder::fromBinder(readBinder); + sp<AIBinder> ret = ABpBinder::lookupOrCreateFromBinder(readBinder); AIBinder_incStrong(ret.get()); *binder = ret.get(); return status; @@ -54,7 +55,7 @@ binder_status_t AParcel_readNullableStrongBinder(const AParcel* parcel, AIBinder if (status != EX_NONE) { return status; } - sp<AIBinder> ret = ABpBinder::fromBinder(readBinder); + sp<AIBinder> ret = ABpBinder::lookupOrCreateFromBinder(readBinder); AIBinder_incStrong(ret.get()); *binder = ret.get(); return status; diff --git a/libs/binder/ndk/AServiceManager.cpp b/libs/binder/ndk/AServiceManager.cpp index 3979945e45..90dd1c810b 100644 --- a/libs/binder/ndk/AServiceManager.cpp +++ b/libs/binder/ndk/AServiceManager.cpp @@ -41,7 +41,7 @@ AIBinder* AServiceManager_getService(const char* instance) { sp<IServiceManager> sm = defaultServiceManager(); sp<IBinder> binder = sm->getService(String16(instance)); - sp<AIBinder> ret = ABpBinder::fromBinder(binder); + sp<AIBinder> ret = ABpBinder::lookupOrCreateFromBinder(binder); AIBinder_incStrong(ret.get()); return ret.get(); } diff --git a/libs/binder/ndk/include_ndk/android/binder_ibinder.h b/libs/binder/ndk/include_ndk/android/binder_ibinder.h index aa2943798d..7dca5a4198 100644 --- a/libs/binder/ndk/include_ndk/android/binder_ibinder.h +++ b/libs/binder/ndk/include_ndk/android/binder_ibinder.h @@ -14,6 +14,16 @@ * limitations under the License. */ +/** + * @addtogroup NdkBinder + * @{ + */ + +/** + * @file binder_ibinder.h + * @brief Object which can receive transactions and be sent across processes. + */ + #pragma once #include <stdint.h> @@ -84,6 +94,16 @@ typedef struct AIBinder_Class AIBinder_Class; * implementation (usually a callback) to transfer all ownership to a remote process and * automatically be deleted when the remote process is done with it or dies. Other memory models are * possible, but this is the standard one. + * + * If the process containing an AIBinder dies, it is possible to be holding a strong reference to + * an object which does not exist. In this case, transactions to this binder will return + * EX_DEAD_OBJECT. See also AIBinder_linkToDeath, AIBinder_unlinkToDeath, and AIBinder_isAlive. + * + * Once an AIBinder is created, anywhere it is passed (remotely or locally), there is a 1-1 + * correspondence between the address of an AIBinder and the object it represents. This means that + * when two AIBinder pointers point to the same address, they represent the same object (whether + * that object is local or remote). This correspondance can be broken accidentally if AIBinder_new + * is erronesouly called to create the same object multiple times. */ struct AIBinder; typedef struct AIBinder AIBinder; @@ -97,6 +117,12 @@ struct AIBinder_Weak; typedef struct AIBinder_Weak AIBinder_Weak; /** + * Represents a handle on a death notification. See AIBinder_linkToDeath/AIBinder_unlinkToDeath. + */ +struct AIBinder_DeathRecipient; +typedef struct AIBinder_DeathRecipient AIBinder_DeathRecipient; + +/** * This is called whenever a new AIBinder object is needed of a specific class. * * These arguments are passed from AIBinder_new. The return value is stored and can be retrieved @@ -138,6 +164,14 @@ __attribute__((warn_unused_result)) AIBinder_Class* AIBinder_Class_define( * * When this is called, the refcount is implicitly 1. So, calling decStrong exactly one time is * required to delete this object. + * + * Once an AIBinder object is created using this API, re-creating that AIBinder for the same + * instance of the same class will break pointer equality for that specific AIBinder object. For + * instance, if someone erroneously created two AIBinder instances representing the same callback + * object and passed one to a hypothetical addCallback function and then later another one to a + * hypothetical removeCallback function, the remote process would have no way to determine that + * these two objects are actually equal using the AIBinder pointer alone (which they should be able + * to do). Also see the suggested memory ownership model suggested above. */ __attribute__((warn_unused_result)) AIBinder* AIBinder_new(const AIBinder_Class* clazz, void* args); @@ -163,6 +197,26 @@ bool AIBinder_isAlive(const AIBinder* binder); binder_status_t AIBinder_ping(AIBinder* binder); /** + * Registers for notifications that the associated binder is dead. The same death recipient may be + * associated with multiple different binders. If the binder is local, then no death recipient will + * be given (since if the local process dies, then no recipient will exist to recieve a + * transaction). The cookie is passed to recipient in the case that this binder dies and can be + * null. The exact cookie must also be used to unlink this transaction (see AIBinder_linkToDeath). + * This function may return a binder transaction failure. The cookie can be used both for + * identification and holding user data. + */ +binder_status_t AIBinder_linkToDeath(AIBinder* binder, AIBinder_DeathRecipient* recipient, + void* cookie); + +/** + * Stops registration for the associated binder dying. Does not delete the recipient. This function + * may return a binder transaction failure and in case the death recipient cannot be found, it + * returns -ENOENT. + */ +binder_status_t AIBinder_unlinkToDeath(AIBinder* binder, AIBinder_DeathRecipient* recipient, + void* cookie); + +/** * This can only be called if a strong reference to this object already exists in process. */ void AIBinder_incStrong(AIBinder* binder); @@ -254,4 +308,23 @@ void AIBinder_Weak_delete(AIBinder_Weak** weakBinder); */ __attribute__((warn_unused_result)) AIBinder* AIBinder_Weak_promote(AIBinder_Weak* weakBinder); +/** + * This function is executed on death receipt. See AIBinder_linkToDeath/AIBinder_unlinkToDeath. + */ +typedef void (*AIBinder_DeathRecipient_onBinderDied)(void* cookie); + +/** + * Creates a new binder death recipient. This can be attached to multiple different binder objects. + */ +__attribute__((warn_unused_result)) AIBinder_DeathRecipient* AIBinder_DeathRecipient_new( + AIBinder_DeathRecipient_onBinderDied onBinderDied); + +/** + * Deletes a binder death recipient. It is not necessary to call AIBinder_unlinkToDeath before + * calling this as these will all be automatically unlinked. + */ +void AIBinder_DeathRecipient_delete(AIBinder_DeathRecipient** recipient); + __END_DECLS + +/** @} */ diff --git a/libs/binder/ndk/include_ndk/android/binder_parcel.h b/libs/binder/ndk/include_ndk/android/binder_parcel.h index 19925f7423..e871ed12b1 100644 --- a/libs/binder/ndk/include_ndk/android/binder_parcel.h +++ b/libs/binder/ndk/include_ndk/android/binder_parcel.h @@ -14,6 +14,16 @@ * limitations under the License. */ +/** + * @addtogroup NdkBinder + * @{ + */ + +/** + * @file binder_parcel.h + * @brief A collection of data that can be sent as a single packet. + */ + #pragma once #include <sys/cdefs.h> @@ -150,3 +160,5 @@ binder_status_t AParcel_readByte(const AParcel* parcel, int8_t* value); // @END __END_DECLS + +/** @} */ diff --git a/libs/binder/ndk/include_ndk/android/binder_status.h b/libs/binder/ndk/include_ndk/android/binder_status.h index d414c99ef9..e97e1816b9 100644 --- a/libs/binder/ndk/include_ndk/android/binder_status.h +++ b/libs/binder/ndk/include_ndk/android/binder_status.h @@ -14,6 +14,15 @@ * limitations under the License. */ +/** + * @addtogroup NdkBinder + * @{ + */ + +/** + * @file binder_status.h + */ + #pragma once #include <stdint.h> @@ -54,3 +63,5 @@ enum { typedef int32_t binder_status_t; __END_DECLS + +/** @} */ diff --git a/libs/binder/ndk/test/main_client.cpp b/libs/binder/ndk/test/main_client.cpp index 967789f140..b8518d7842 100644 --- a/libs/binder/ndk/test/main_client.cpp +++ b/libs/binder/ndk/test/main_client.cpp @@ -16,6 +16,7 @@ #include <android-base/logging.h> #include <android/binder_manager.h> +#include <android/binder_process.h> #include <gtest/gtest.h> #include <iface/iface.h> @@ -45,6 +46,28 @@ TEST(NdkBinder, RetrieveNonNdkService) { AIBinder_decStrong(binder); } +void OnBinderDeath(void* cookie) { + LOG(ERROR) << "BINDER DIED. COOKIE: " << cookie; +} + +TEST(NdkBinder, LinkToDeath) { + ABinderProcess_setThreadPoolMaxThreadCount(1); // to recieve death notifications + ABinderProcess_startThreadPool(); + + AIBinder* binder = AServiceManager_getService(kExistingNonNdkService); + ASSERT_NE(nullptr, binder); + + AIBinder_DeathRecipient* recipient = AIBinder_DeathRecipient_new(OnBinderDeath); + ASSERT_NE(nullptr, recipient); + + EXPECT_EQ(EX_NONE, AIBinder_linkToDeath(binder, recipient, nullptr)); + EXPECT_EQ(EX_NONE, AIBinder_unlinkToDeath(binder, recipient, nullptr)); + EXPECT_EQ(-ENOENT, AIBinder_unlinkToDeath(binder, recipient, nullptr)); + + AIBinder_DeathRecipient_delete(&recipient); + AIBinder_decStrong(binder); +} + class MyTestFoo : public IFoo { int32_t doubleNumber(int32_t in) override { LOG(INFO) << "doubleNumber " << in; @@ -64,6 +87,34 @@ TEST(NdkBinder, GetServiceInProcess) { EXPECT_EQ(2, getFoo->doubleNumber(1)); } +TEST(NdkBinder, EqualityOfRemoteBinderPointer) { + AIBinder* binderA = AServiceManager_getService(kExistingNonNdkService); + ASSERT_NE(nullptr, binderA); + + AIBinder* binderB = AServiceManager_getService(kExistingNonNdkService); + ASSERT_NE(nullptr, binderB); + + EXPECT_EQ(binderA, binderB); + + AIBinder_decStrong(binderA); + AIBinder_decStrong(binderB); +} + +TEST(NdkBinder, ABpBinderRefCount) { + AIBinder* binder = AServiceManager_getService(kExistingNonNdkService); + AIBinder_Weak* wBinder = AIBinder_Weak_new(binder); + + ASSERT_NE(nullptr, binder); + EXPECT_EQ(1, AIBinder_debugGetRefCount(binder)); + + AIBinder_decStrong(binder); + + // assert because would need to decStrong if non-null and we shouldn't need to add a no-op here + ASSERT_NE(nullptr, AIBinder_Weak_promote(wBinder)); + + AIBinder_Weak_delete(&wBinder); +} + TEST(NdkBinder, AddServiceMultipleTimes) { static const char* kInstanceName1 = "test-multi-1"; static const char* kInstanceName2 = "test-multi-2"; diff --git a/vulkan/api/vulkan.api b/vulkan/api/vulkan.api index 76eca3545c..8817e8d400 100644 --- a/vulkan/api/vulkan.api +++ b/vulkan/api/vulkan.api @@ -28,7 +28,7 @@ import platform "platform.api" // API version (major.minor.patch) define VERSION_MAJOR 1 define VERSION_MINOR 1 -define VERSION_PATCH 82 +define VERSION_PATCH 84 // API limits define VK_MAX_PHYSICAL_DEVICE_NAME_SIZE 256 @@ -221,6 +221,10 @@ define NULL_HANDLE 0 @extension("VK_EXT_shader_subgroup_vote") define VK_EXT_SHADER_SUBGROUP_VOTE_SPEC_VERSION 1 @extension("VK_EXT_shader_subgroup_vote") define VK_EXT_SHADER_SUBGROUP_VOTE_EXTENSION_NAME "VK_EXT_shader_subgroup_vote" +// 68 +@extension("VK_EXT_astc_decode_mode") define VK_EXT_ASTC_DECODE_MODE_SPEC_VERSION 1 +@extension("VK_EXT_astc_decode_mode") define VK_EXT_ASTC_DECODE_MODE_EXTENSION_NAME "VK_EXT_astc_decode_mode" + // 70 @extension("VK_KHR_maintenance1") define VK_KHR_MAINTENANCE1_SPEC_VERSION 2 @extension("VK_KHR_maintenance1") define VK_KHR_MAINTENANCE1_EXTENSION_NAME "VK_KHR_maintenance1" @@ -437,6 +441,10 @@ define NULL_HANDLE 0 @extension("VK_AMD_shader_fragment_mask") define VK_AMD_SHADER_FRAGMENT_MASK_SPEC_VERSION 1 @extension("VK_AMD_shader_fragment_mask") define VK_AMD_SHADER_FRAGMENT_MASK_EXTENSION_NAME "VK_AMD_shader_fragment_mask" +// 139 +@extension("VK_EXT_inline_uniform_block") define VK_EXT_INLINE_UNIFORM_BLOCK_SPEC_VERSION 1 +@extension("VK_EXT_inline_uniform_block") define VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME "VK_EXT_inline_uniform_block" + // 141 @extension("VK_EXT_shader_stencil_export") define VK_EXT_SHADER_STENCIL_EXPORT_SPEC_VERSION 1 @extension("VK_EXT_shader_stencil_export") define VK_EXT_SHADER_STENCIL_EXPORT_EXTENSION_NAME "VK_EXT_shader_stencil_export" @@ -526,8 +534,8 @@ define NULL_HANDLE 0 @extension("VK_AMD_shader_core_properties") define VK_AMD_SHADER_CORE_PROPERTIES_EXTENSION_NAME "VK_AMD_shader_core_properties" // 191 -@extension("VK_EXT_vertex_attribute_divisor") define VK_AMD_SHADER_CORE_PROPERTIES_SPEC_VERSION 1 -@extension("VK_EXT_vertex_attribute_divisor") define VK_AMD_BUFFER_MARKER_EXTENSION_NAME "VK_EXT_vertex_attribute_divisor" +@extension("VK_EXT_vertex_attribute_divisor") define VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_SPEC_VERSION 2 +@extension("VK_EXT_vertex_attribute_divisor") define VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME "VK_EXT_vertex_attribute_divisor" // 199 @extension("VK_NV_shader_subgroup_partitioned") define VK_NV_SHADER_SUBGROUP_PARTITIONED_SPEC_VERSION 1 @@ -537,6 +545,10 @@ define NULL_HANDLE 0 @extension("VK_NV_device_diagnostic_checkpoints") define VK_NV_DEVICE_DIAGNOSTIC_CHECKPOINTS_SPEC_VERSION 2 @extension("VK_NV_device_diagnostic_checkpoints") define VK_NV_DEVICE_DIAGNOSTIC_CHECKPOINTS_EXTENSION_NAME "VK_NV_device_diagnostic_checkpoints" +// 212 +@extension("VK_KHR_vulkan_memory_model") define VK_KHR_VULKAN_MEMORY_MODEL_SPEC_VERSION 2 +@extension("VK_KHR_vulkan_memory_model") define VK_KHR_VULKAN_MEMORY_MODEL_EXTENSION_NAME "VK_KHR_vulkan_memory_model" + ///////////// // Types // ///////////// @@ -697,6 +709,9 @@ enum VkDescriptorType { VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC = 0x00000008, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC = 0x00000009, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT = 0x0000000a, + + //@extension("VK_EXT_inline_uniform_block") // 139 + VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT = 1000138000, } enum VkQueryType { @@ -1416,6 +1431,10 @@ enum VkStructureType { //@extension("VK_NN_vi_surface") // 63 VK_STRUCTURE_TYPE_VI_SURFACE_CREATE_INFO_NN = 1000062000, + //@extension("VK_EXT_astc_decode_mode") // 68 + VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT = 1000067000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT = 1000067001, + //@extension("VK_KHR_device_group_creation") // 71 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES_KHR = 1000070000, VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO_KHR = 1000070001, @@ -1595,6 +1614,12 @@ enum VkStructureType { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES_EXT = 1000130000, VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO_EXT = 1000130001, + //@extension("VK_EXT_inline_uniform_block") // 139 + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT = 1000138000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT = 1000138001, + VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT = 1000138002, + VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT = 1000138003, + //@extension("VK_EXT_sample_locations") // 144 VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT = 1000143000, VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT = 1000143001, @@ -1667,10 +1692,14 @@ enum VkStructureType { //@extension("VK_EXT_vertex_attribute_divisor") // 191 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT = 1000190000, VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT = 1000190001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT = 1000190002, //@extension("VK_NV_device_diagnostic_checkpoints") // 207 VK_STRUCTURE_TYPE_CHECKPOINT_DATA_NV = 1000206000, VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV = 1000206001, + + //@extension("VK_KHR_vulkan_memory_model") // 212 + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES_KHR = 1000211000, } enum VkSubpassContents { @@ -5354,6 +5383,20 @@ class VkViSurfaceCreateInfoNN { void* window } +@extension("VK_EXT_astc_decode_mode") // 68 +class VkImageViewASTCDecodeModeEXT { + VkStructureType sType + const void* pNext + VkFormat decodeMode +} + +@extension("VK_EXT_astc_decode_mode") // 68 +class VkPhysicalDeviceASTCDecodeFeaturesEXT { + VkStructureType sType + void* pNext + VkBool32 decodeModeSharedExponent +} + @extension("VK_KHR_device_group_creation") // 71 class VkPhysicalDeviceGroupPropertiesKHR { VkStructureType sType @@ -6386,6 +6429,40 @@ class VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT { VkBool32 filterMinmaxImageComponentMapping } +@extension("VK_EXT_inline_uniform_block") // 139 +class VkPhysicalDeviceInlineUniformBlockFeaturesEXT { + VkStructureType sType + void* pNext + VkBool32 inlineUniformBlock + VkBool32 descriptorBindingInlineUniformBlockUpdateAfterBind +} + +@extension("VK_EXT_inline_uniform_block") // 139 +class VkPhysicalDeviceInlineUniformBlockPropertiesEXT { + VkStructureType sType + void* pNext + u32 maxInlineUniformBlockSize + u32 maxPerStageDescriptorInlineUniformBlocks + u32 maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks + u32 maxDescriptorSetInlineUniformBlocks + u32 maxDescriptorSetUpdateAfterBindInlineUniformBlocks +} + +@extension("VK_EXT_inline_uniform_block") // 139 +class VkWriteDescriptorSetInlineUniformBlockEXT { + VkStructureType sType + const void* pNext + u32 dataSize + const void* pData +} + +@extension("VK_EXT_inline_uniform_block") // 139 +class VkDescriptorPoolInlineUniformBlockCreateInfoEXT { + VkStructureType sType + const void* pNext + u32 maxInlineUniformBlockBindings +} + @extension("VK_EXT_sample_locations") // 144 class VkSampleLocationEXT { f32 x @@ -6796,6 +6873,14 @@ class VkPipelineVertexInputDivisorStateCreateInfoEXT { const VkVertexInputBindingDivisorDescriptionEXT* pVertexBindingDivisors } +@extension("VK_EXT_vertex_attribute_divisor") // 191 +class VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT { + VkStructureType sType + void* pNext + VkBool32 vertexAttributeInstanceRateDivisor + VkBool32 vertexAttributeInstanceRateZeroDivisor +} + @extension("VK_NV_device_diagnostic_checkpoints") // 207 class VkQueueFamilyCheckpointPropertiesNV { VkStructureType sType @@ -6811,6 +6896,14 @@ class VkCheckpointDataNV { void* pCheckpointMarker } +@extension("VK_KHR_vulkan_memory_model") // 212 +class VkPhysicalDeviceVulkanMemoryModelFeaturesKHR { + VkStructureType sType + void* pNext + VkBool32 vulkanMemoryModel + VkBool32 vulkanMemoryModelDeviceScope +} + //////////////// // Commands // diff --git a/vulkan/include/vulkan/vulkan_core.h b/vulkan/include/vulkan/vulkan_core.h index d5110159eb..fe45014250 100644 --- a/vulkan/include/vulkan/vulkan_core.h +++ b/vulkan/include/vulkan/vulkan_core.h @@ -43,7 +43,7 @@ extern "C" { #define VK_VERSION_MINOR(version) (((uint32_t)(version) >> 12) & 0x3ff) #define VK_VERSION_PATCH(version) ((uint32_t)(version) & 0xfff) // Version of this file -#define VK_HEADER_VERSION 82 +#define VK_HEADER_VERSION 84 #define VK_NULL_HANDLE 0 @@ -305,6 +305,8 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV = 1000058000, VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT = 1000061000, VK_STRUCTURE_TYPE_VI_SURFACE_CREATE_INFO_NN = 1000062000, + VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT = 1000067000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT = 1000067001, VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR = 1000073000, VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR = 1000073001, VK_STRUCTURE_TYPE_MEMORY_WIN32_HANDLE_PROPERTIES_KHR = 1000073002, @@ -380,6 +382,10 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID = 1000129005, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES_EXT = 1000130000, VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO_EXT = 1000130001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT = 1000138000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT = 1000138001, + VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT = 1000138002, + VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT = 1000138003, VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT = 1000143000, VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT = 1000143001, VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT = 1000143002, @@ -406,8 +412,11 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD = 1000185000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT = 1000190000, VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT = 1000190001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT = 1000190002, VK_STRUCTURE_TYPE_CHECKPOINT_DATA_NV = 1000206000, VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV = 1000206001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES_KHR = 1000211000, + VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT, VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES, @@ -442,6 +451,7 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES, VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO, + VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES2_EXT = VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO, VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES_KHR = VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES, VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO, @@ -1120,6 +1130,7 @@ typedef enum VkDescriptorType { VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC = 8, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC = 9, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT = 10, + VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT = 1000138000, VK_DESCRIPTOR_TYPE_BEGIN_RANGE = VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_END_RANGE = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, VK_DESCRIPTOR_TYPE_RANGE_SIZE = (VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT - VK_DESCRIPTOR_TYPE_SAMPLER + 1), @@ -4575,7 +4586,6 @@ VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSurfaceKHR) #define VK_KHR_SURFACE_SPEC_VERSION 25 #define VK_KHR_SURFACE_EXTENSION_NAME "VK_KHR_surface" -#define VK_COLORSPACE_SRGB_NONLINEAR_KHR VK_COLOR_SPACE_SRGB_NONLINEAR_KHR typedef enum VkColorSpaceKHR { @@ -4594,6 +4604,7 @@ typedef enum VkColorSpaceKHR { VK_COLOR_SPACE_ADOBERGB_NONLINEAR_EXT = 1000104012, VK_COLOR_SPACE_PASS_THROUGH_EXT = 1000104013, VK_COLOR_SPACE_EXTENDED_SRGB_NONLINEAR_EXT = 1000104014, + VK_COLORSPACE_SRGB_NONLINEAR_KHR = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR, VK_COLOR_SPACE_BEGIN_RANGE_KHR = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR, VK_COLOR_SPACE_END_RANGE_KHR = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR, VK_COLOR_SPACE_RANGE_SIZE_KHR = (VK_COLOR_SPACE_SRGB_NONLINEAR_KHR - VK_COLOR_SPACE_SRGB_NONLINEAR_KHR + 1), @@ -5981,13 +5992,24 @@ typedef struct VkPhysicalDevice8BitStorageFeaturesKHR { +#define VK_KHR_vulkan_memory_model 1 +#define VK_KHR_VULKAN_MEMORY_MODEL_SPEC_VERSION 2 +#define VK_KHR_VULKAN_MEMORY_MODEL_EXTENSION_NAME "VK_KHR_vulkan_memory_model" + +typedef struct VkPhysicalDeviceVulkanMemoryModelFeaturesKHR { + VkStructureType sType; + void* pNext; + VkBool32 vulkanMemoryModel; + VkBool32 vulkanMemoryModelDeviceScope; +} VkPhysicalDeviceVulkanMemoryModelFeaturesKHR; + + + #define VK_EXT_debug_report 1 VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDebugReportCallbackEXT) #define VK_EXT_DEBUG_REPORT_SPEC_VERSION 9 #define VK_EXT_DEBUG_REPORT_EXTENSION_NAME "VK_EXT_debug_report" -#define VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT -#define VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT_EXT typedef enum VkDebugReportObjectTypeEXT { @@ -6027,6 +6049,8 @@ typedef enum VkDebugReportObjectTypeEXT { VK_DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT_EXT = 33, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION_EXT = 1000156000, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_EXT = 1000085000, + VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT = VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT_EXT, + VK_DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT = VK_DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_KHR_EXT = VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION_KHR_EXT = VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_BEGIN_RANGE_EXT = VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, @@ -6431,6 +6455,24 @@ typedef struct VkValidationFlagsEXT { #define VK_EXT_SHADER_SUBGROUP_VOTE_EXTENSION_NAME "VK_EXT_shader_subgroup_vote" +#define VK_EXT_astc_decode_mode 1 +#define VK_EXT_ASTC_DECODE_MODE_SPEC_VERSION 1 +#define VK_EXT_ASTC_DECODE_MODE_EXTENSION_NAME "VK_EXT_astc_decode_mode" + +typedef struct VkImageViewASTCDecodeModeEXT { + VkStructureType sType; + const void* pNext; + VkFormat decodeMode; +} VkImageViewASTCDecodeModeEXT; + +typedef struct VkPhysicalDeviceASTCDecodeFeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 decodeModeSharedExponent; +} VkPhysicalDeviceASTCDecodeFeaturesEXT; + + + #define VK_EXT_conditional_rendering 1 #define VK_EXT_CONDITIONAL_RENDERING_SPEC_VERSION 1 #define VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME "VK_EXT_conditional_rendering" @@ -6746,7 +6788,6 @@ VKAPI_ATTR VkResult VKAPI_CALL vkReleaseDisplayEXT( #define VK_EXT_display_surface_counter 1 #define VK_EXT_DISPLAY_SURFACE_COUNTER_SPEC_VERSION 1 #define VK_EXT_DISPLAY_SURFACE_COUNTER_EXTENSION_NAME "VK_EXT_display_surface_counter" -#define VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES2_EXT VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_EXT typedef enum VkSurfaceCounterFlagBitsEXT { @@ -7300,6 +7341,42 @@ typedef struct VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT { #define VK_AMD_SHADER_FRAGMENT_MASK_EXTENSION_NAME "VK_AMD_shader_fragment_mask" +#define VK_EXT_inline_uniform_block 1 +#define VK_EXT_INLINE_UNIFORM_BLOCK_SPEC_VERSION 1 +#define VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME "VK_EXT_inline_uniform_block" + +typedef struct VkPhysicalDeviceInlineUniformBlockFeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 inlineUniformBlock; + VkBool32 descriptorBindingInlineUniformBlockUpdateAfterBind; +} VkPhysicalDeviceInlineUniformBlockFeaturesEXT; + +typedef struct VkPhysicalDeviceInlineUniformBlockPropertiesEXT { + VkStructureType sType; + void* pNext; + uint32_t maxInlineUniformBlockSize; + uint32_t maxPerStageDescriptorInlineUniformBlocks; + uint32_t maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks; + uint32_t maxDescriptorSetInlineUniformBlocks; + uint32_t maxDescriptorSetUpdateAfterBindInlineUniformBlocks; +} VkPhysicalDeviceInlineUniformBlockPropertiesEXT; + +typedef struct VkWriteDescriptorSetInlineUniformBlockEXT { + VkStructureType sType; + const void* pNext; + uint32_t dataSize; + const void* pData; +} VkWriteDescriptorSetInlineUniformBlockEXT; + +typedef struct VkDescriptorPoolInlineUniformBlockCreateInfoEXT { + VkStructureType sType; + const void* pNext; + uint32_t maxInlineUniformBlockBindings; +} VkDescriptorPoolInlineUniformBlockCreateInfoEXT; + + + #define VK_EXT_shader_stencil_export 1 #define VK_EXT_SHADER_STENCIL_EXPORT_SPEC_VERSION 1 #define VK_EXT_SHADER_STENCIL_EXPORT_EXTENSION_NAME "VK_EXT_shader_stencil_export" @@ -7483,7 +7560,6 @@ VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkValidationCacheEXT) #define VK_EXT_VALIDATION_CACHE_SPEC_VERSION 1 #define VK_EXT_VALIDATION_CACHE_EXTENSION_NAME "VK_EXT_validation_cache" -#define VK_DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT VK_DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT_EXT typedef enum VkValidationCacheHeaderVersionEXT { @@ -7734,7 +7810,7 @@ typedef struct VkPhysicalDeviceShaderCorePropertiesAMD { #define VK_EXT_vertex_attribute_divisor 1 -#define VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_SPEC_VERSION 2 +#define VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_SPEC_VERSION 3 #define VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME "VK_EXT_vertex_attribute_divisor" typedef struct VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT { @@ -7755,6 +7831,13 @@ typedef struct VkPipelineVertexInputDivisorStateCreateInfoEXT { const VkVertexInputBindingDivisorDescriptionEXT* pVertexBindingDivisors; } VkPipelineVertexInputDivisorStateCreateInfoEXT; +typedef struct VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 vertexAttributeInstanceRateDivisor; + VkBool32 vertexAttributeInstanceRateZeroDivisor; +} VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT; + #define VK_NV_shader_subgroup_partitioned 1 |