gfxstream: cereal: fix 'None' in gfxstream codegen
Some checks are pending
macOS-CI / macOS-CI (dri) (push) Waiting to run
macOS-CI / macOS-CI (xlib) (push) Waiting to run

Commit e27e41a842 ("vulkan,spirv: update headers") exposed a
flaw in the cerealgenerator.

It modified -- among other things -- the VkDeviceCreateInfo
struct in vk.xml.

In the update, the len="enabledLayerCount,null-terminated"
attribute was removed from the ppEnabledLayerNames member.

The gfxstream code generator processes ppEnabledLayerNames
(which is a const char* const*), it identifies it as an "array of
strings". However, because the len attribute is now missing,
vulkanType.getLengthExpression() returns None.

This leads to errors like:

gfxstream_guest_vk_autogen_impl/gen/goldfish_vk_counting_guest.cpp:642:30:
error: use of undeclared identifier 'None'

     642 |     for (uint32_t i = 0; i < None; ++i)
         |                              ^~~~
   1 error generated.

This patch adds various length access checks to prevent this from
happening.

TEST=m vulkan.ranchu

Reviewed-by: David Gilhooley <djgilhooley@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/40785>
This commit is contained in:
Gurchetan Singh 2026-04-02 16:45:50 -07:00
parent 77835f6c21
commit c4cecd9d19
6 changed files with 87 additions and 75 deletions

View file

@ -370,6 +370,7 @@ class VulkanCountingCodegen(VulkanTypeIterator):
lenAccessGuard = self.lenAccessorGuard(vulkanType) lenAccessGuard = self.lenAccessorGuard(vulkanType)
self.genCount("sizeof(uint32_t)") self.genCount("sizeof(uint32_t)")
if lenAccess is not None:
if lenAccessGuard is not None: if lenAccessGuard is not None:
self.cgen.beginIf(lenAccessGuard) self.cgen.beginIf(lenAccessGuard)
self.cgen.beginFor("uint32_t i = 0", "i < %s" % lenAccess, "++i") self.cgen.beginFor("uint32_t i = 0", "i < %s" % lenAccess, "++i")
@ -383,6 +384,7 @@ class VulkanCountingCodegen(VulkanTypeIterator):
lenAccess = self.lenAccessor(vulkanType) lenAccess = self.lenAccessor(vulkanType)
lenAccessGuard = self.lenAccessorGuard(vulkanType) lenAccessGuard = self.lenAccessorGuard(vulkanType)
if lenAccess is not None:
if lenAccessGuard is not None: if lenAccessGuard is not None:
self.cgen.beginIf(lenAccessGuard) self.cgen.beginIf(lenAccessGuard)
finalLenExpr = "%s * %s" % (lenAccess, self.cgen.sizeofExpr(vulkanType)) finalLenExpr = "%s * %s" % (lenAccess, self.cgen.sizeofExpr(vulkanType))

View file

@ -155,6 +155,7 @@ class DeepcopyCodegen(VulkanTypeIterator):
lenAccessLhs = self.lenAccessorLhs(vulkanType) lenAccessLhs = self.lenAccessorLhs(vulkanType)
self.cgen.stmt("%s = nullptr" % accessRhs) self.cgen.stmt("%s = nullptr" % accessRhs)
if lenAccessLhs is not None:
self.cgen.beginIf("%s && %s" % (accessLhs, lenAccessLhs)) self.cgen.beginIf("%s && %s" % (accessLhs, lenAccessLhs))
self.cgen.stmt( \ self.cgen.stmt( \

View file

@ -108,6 +108,7 @@ class HandleMapCodegen(VulkanTypeIterator):
accessLhs = self.exprAccessor(vulkanType) accessLhs = self.exprAccessor(vulkanType)
lenAccess = self.lenAccessor(vulkanType) lenAccess = self.lenAccessor(vulkanType)
if lenAccess is not None:
self.cgen.stmt("%s->mapHandles_%s(%s%s, %s)" % \ self.cgen.stmt("%s->mapHandles_%s(%s%s, %s)" % \
(self.handlemapVarName, vulkanType.typeName, (self.handlemapVarName, vulkanType.typeName,
self.makeCastExpr(vulkanType.getForAddressAccess().getForNonConstAccess()), self.makeCastExpr(vulkanType.getForAddressAccess().getForNonConstAccess()),

View file

@ -455,6 +455,7 @@ class VulkanMarshalingCodegen(VulkanTypeIterator):
lenAccess = self.lenAccessor(vulkanType) lenAccess = self.lenAccessor(vulkanType)
if self.direction == "write": if self.direction == "write":
if lenAccess is not None:
self.cgen.stmt("saveStringArray(%s, %s, %s)" % (self.streamVarName, self.cgen.stmt("saveStringArray(%s, %s, %s)" % (self.streamVarName,
access, lenAccess)) access, lenAccess))
else: else:
@ -468,7 +469,10 @@ class VulkanMarshalingCodegen(VulkanTypeIterator):
def onStaticArr(self, vulkanType): def onStaticArr(self, vulkanType):
access = self.exprValueAccessor(vulkanType) access = self.exprValueAccessor(vulkanType)
lenAccess = self.lenAccessor(vulkanType) lenAccess = self.lenAccessor(vulkanType)
if lenAccess is not None:
finalLenExpr = "%s * %s" % (lenAccess, self.cgen.sizeofExpr(vulkanType)) finalLenExpr = "%s * %s" % (lenAccess, self.cgen.sizeofExpr(vulkanType))
else:
finalLenExpr = self.cgen.sizeofExpr(vulkanType)
self.genStreamCall(vulkanType, access, finalLenExpr) self.genStreamCall(vulkanType, access, finalLenExpr)
# Old version VkEncoder may have some sType values conflict with VkDecoder # Old version VkEncoder may have some sType values conflict with VkDecoder

View file

@ -548,6 +548,7 @@ class VulkanReservedMarshalingCodegen(VulkanTypeIterator):
lenAccessGuard = self.lenAccessorGuard(vulkanType) lenAccessGuard = self.lenAccessorGuard(vulkanType)
if self.direction == "write": if self.direction == "write":
if lenAccess is not None:
self.cgen.beginBlock() self.cgen.beginBlock()
self.cgen.stmt("uint32_t c = 0") self.cgen.stmt("uint32_t c = 0")
@ -578,6 +579,7 @@ class VulkanReservedMarshalingCodegen(VulkanTypeIterator):
def onStaticArr(self, vulkanType): def onStaticArr(self, vulkanType):
access = self.exprValueAccessor(vulkanType) access = self.exprValueAccessor(vulkanType)
lenAccess = self.lenAccessor(vulkanType) lenAccess = self.lenAccessor(vulkanType)
if lenAccess is not None:
finalLenExpr = "%s * %s" % (lenAccess, self.cgen.sizeofExpr(vulkanType)) finalLenExpr = "%s * %s" % (lenAccess, self.cgen.sizeofExpr(vulkanType))
self.genStreamCall(vulkanType, access, finalLenExpr) self.genStreamCall(vulkanType, access, finalLenExpr)

View file

@ -205,6 +205,7 @@ class VulkanEqualityCodegen(VulkanTypeIterator):
vulkanType, vulkanType,
"Mismatch in string array pointer nullness") "Mismatch in string array pointer nullness")
if lenAccessLhs is not None and lenAccessRhs is not None:
equalLenExpr = self.makeEqualExpr(lenAccessLhs, lenAccessRhs) equalLenExpr = self.makeEqualExpr(lenAccessLhs, lenAccessRhs)
self.compareWithConsequence( \ self.compareWithConsequence( \
@ -246,6 +247,7 @@ class VulkanEqualityCodegen(VulkanTypeIterator):
lenAccessLhs = self.lenAccessorLhs(vulkanType) lenAccessLhs = self.lenAccessorLhs(vulkanType)
if lenAccessLhs is not None:
finalLenExpr = "%s * %s" % (lenAccessLhs, finalLenExpr = "%s * %s" % (lenAccessLhs,
self.cgen.sizeofExpr(vulkanType)) self.cgen.sizeofExpr(vulkanType))