mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 04:58:05 +02:00
gfxstream: cereal: fix 'None' in gfxstream codegen
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:
parent
77835f6c21
commit
c4cecd9d19
6 changed files with 87 additions and 75 deletions
|
|
@ -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))
|
||||||
|
|
|
||||||
|
|
@ -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( \
|
||||||
|
|
|
||||||
|
|
@ -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()),
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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))
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue