зеркало из https://github.com/AvaloniaUI/angle.git
Capture/Replay: Set FBO ID when generated on bind
GLES allows FBO ID's to be reserved on bind, so if a FBO is bound with and ID that was not yet reserved by a glGenFramebuffers call, update the resource tracking and the resource map to account for this resources that was created on bind. Bug: angleproject:6425 Change-Id: I343fc17bfbbfd9c8c47d6fe207a4f3817acb835d Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3190970 Commit-Queue: Gert Wollny <gert.wollny@collabora.com> Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Cody Northrop <cnorthrop@google.com>
This commit is contained in:
Родитель
b9e96af0a8
Коммит
1d555687bc
|
@ -4985,6 +4985,7 @@ void FrameCaptureShared::maybeCapturePreCallUpdates(
|
||||||
}
|
}
|
||||||
|
|
||||||
case EntryPoint::GLGenFramebuffers:
|
case EntryPoint::GLGenFramebuffers:
|
||||||
|
case EntryPoint::GLGenFramebuffersOES:
|
||||||
{
|
{
|
||||||
GLsizei count = call.params.getParam("n", ParamType::TGLsizei, 0).value.GLsizeiVal;
|
GLsizei count = call.params.getParam("n", ParamType::TGLsizei, 0).value.GLsizeiVal;
|
||||||
const gl::FramebufferID *framebufferIDs =
|
const gl::FramebufferID *framebufferIDs =
|
||||||
|
@ -4996,6 +4997,13 @@ void FrameCaptureShared::maybeCapturePreCallUpdates(
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case EntryPoint::GLBindFramebuffer:
|
||||||
|
case EntryPoint::GLBindFramebufferOES:
|
||||||
|
maybeGenResourceOnBind<gl::FramebufferID>(call, "framebufferPacked",
|
||||||
|
ParamType::TFramebufferID);
|
||||||
|
break;
|
||||||
|
|
||||||
case EntryPoint::GLGenTextures:
|
case EntryPoint::GLGenTextures:
|
||||||
{
|
{
|
||||||
GLsizei count = call.params.getParam("n", ParamType::TGLsizei, 0).value.GLsizeiVal;
|
GLsizei count = call.params.getParam("n", ParamType::TGLsizei, 0).value.GLsizeiVal;
|
||||||
|
@ -5359,6 +5367,32 @@ void FrameCaptureShared::maybeCapturePreCallUpdates(
|
||||||
updateResourceCounts(call);
|
updateResourceCounts(call);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename ParamValueType>
|
||||||
|
void FrameCaptureShared::maybeGenResourceOnBind(CallCapture &call,
|
||||||
|
const char *paramName,
|
||||||
|
ParamType paramType)
|
||||||
|
{
|
||||||
|
const ParamCapture ¶m = call.params.getParam(paramName, paramType, 1);
|
||||||
|
const ParamValueType id = AccessParamValue<ParamValueType>(paramType, param.value);
|
||||||
|
|
||||||
|
// Don't inject the default resource or resources that are already generated
|
||||||
|
if (id.value != 0 && !resourceIsGenerated(id))
|
||||||
|
{
|
||||||
|
handleGennedResource(id);
|
||||||
|
|
||||||
|
ResourceIDType resourceIDType = GetResourceIDTypeFromParamType(param.type);
|
||||||
|
const char *resourceName = GetResourceIDTypeName(resourceIDType);
|
||||||
|
|
||||||
|
std::stringstream updateFuncNameStr;
|
||||||
|
updateFuncNameStr << "Set" << resourceName << "ID";
|
||||||
|
std::string updateFuncName = updateFuncNameStr.str();
|
||||||
|
|
||||||
|
ParamBuffer params;
|
||||||
|
params.addValueParam("id", ParamType::TGLuint, id.value);
|
||||||
|
mFrameCalls.emplace_back(updateFuncName, std::move(params));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void FrameCaptureShared::updateResourceCounts(const CallCapture &call)
|
void FrameCaptureShared::updateResourceCounts(const CallCapture &call)
|
||||||
{
|
{
|
||||||
for (const ParamCapture ¶m : call.params.getParamCaptures())
|
for (const ParamCapture ¶m : call.params.getParamCaptures())
|
||||||
|
@ -5927,6 +5961,11 @@ void TrackedResource::setGennedResource(GLuint id)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool TrackedResource::resourceIsGenerated(GLuint id)
|
||||||
|
{
|
||||||
|
return mNewResources.find(id) != mNewResources.end();
|
||||||
|
}
|
||||||
|
|
||||||
void TrackedResource::setDeletedResource(GLuint id)
|
void TrackedResource::setDeletedResource(GLuint id)
|
||||||
{
|
{
|
||||||
if (id == 0)
|
if (id == 0)
|
||||||
|
|
|
@ -236,6 +236,7 @@ class TrackedResource final : angle::NonCopyable
|
||||||
void setGennedResource(GLuint id);
|
void setGennedResource(GLuint id);
|
||||||
void setDeletedResource(GLuint id);
|
void setDeletedResource(GLuint id);
|
||||||
void setModifiedResource(GLuint id);
|
void setModifiedResource(GLuint id);
|
||||||
|
bool resourceIsGenerated(GLuint id);
|
||||||
|
|
||||||
ResourceCalls &getResourceRegenCalls() { return mResourceRegenCalls; }
|
ResourceCalls &getResourceRegenCalls() { return mResourceRegenCalls; }
|
||||||
ResourceCalls &getResourceRestoreCalls() { return mResourceRestoreCalls; }
|
ResourceCalls &getResourceRestoreCalls() { return mResourceRestoreCalls; }
|
||||||
|
@ -486,6 +487,14 @@ class FrameCaptureShared final : angle::NonCopyable
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename ResourceType>
|
||||||
|
bool resourceIsGenerated(ResourceType resourceID)
|
||||||
|
{
|
||||||
|
ResourceIDType idType = GetResourceIDTypeFromType<ResourceType>::IDType;
|
||||||
|
TrackedResource &tracker = mResourceTracker.getTrackedResource(idType);
|
||||||
|
return tracker.resourceIsGenerated(resourceID.value);
|
||||||
|
}
|
||||||
|
|
||||||
template <typename ResourceType>
|
template <typename ResourceType>
|
||||||
void handleDeletedResource(ResourceType resourceID)
|
void handleDeletedResource(ResourceType resourceID)
|
||||||
{
|
{
|
||||||
|
@ -518,6 +527,8 @@ class FrameCaptureShared final : angle::NonCopyable
|
||||||
CallCapture &call,
|
CallCapture &call,
|
||||||
std::vector<CallCapture> *shareGroupSetupCalls,
|
std::vector<CallCapture> *shareGroupSetupCalls,
|
||||||
ResourceIDToSetupCallsMap *resourceIDToSetupCalls);
|
ResourceIDToSetupCallsMap *resourceIDToSetupCalls);
|
||||||
|
template <typename ParamValueType>
|
||||||
|
void maybeGenResourceOnBind(CallCapture &call, const char *paramName, ParamType paramType);
|
||||||
void maybeCapturePostCallUpdates(const gl::Context *context);
|
void maybeCapturePostCallUpdates(const gl::Context *context);
|
||||||
void maybeCaptureDrawArraysClientData(const gl::Context *context,
|
void maybeCaptureDrawArraysClientData(const gl::Context *context,
|
||||||
CallCapture &call,
|
CallCapture &call,
|
||||||
|
|
|
@ -406,6 +406,21 @@ void UpdateVertexArrayID2(GLuint id, GLsizei readBufferOffset)
|
||||||
UpdateResourceMap2(gVertexArrayMap2, id, readBufferOffset);
|
UpdateResourceMap2(gVertexArrayMap2, id, readBufferOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SetResourceID(GLuint *map, GLuint id)
|
||||||
|
{
|
||||||
|
if (map[id] != 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: resource ID %d is already reserved\n", __func__, id);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
map[id] = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetFramebufferID(GLuint id)
|
||||||
|
{
|
||||||
|
SetResourceID(gFramebufferMap2, id);
|
||||||
|
}
|
||||||
|
|
||||||
void ValidateSerializedState(const char *serializedState, const char *fileName, uint32_t line)
|
void ValidateSerializedState(const char *serializedState, const char *fileName, uint32_t line)
|
||||||
{
|
{
|
||||||
if (gValidateSerializedStateCallback)
|
if (gValidateSerializedStateCallback)
|
||||||
|
|
|
@ -176,6 +176,8 @@ void UpdateTextureID2(GLuint id, GLsizei readBufferOffset);
|
||||||
void UpdateTransformFeedbackID2(GLuint id, GLsizei readBufferOffset);
|
void UpdateTransformFeedbackID2(GLuint id, GLsizei readBufferOffset);
|
||||||
void UpdateVertexArrayID2(GLuint id, GLsizei readBufferOffset);
|
void UpdateVertexArrayID2(GLuint id, GLsizei readBufferOffset);
|
||||||
|
|
||||||
|
void SetFramebufferID(GLuint id);
|
||||||
|
|
||||||
void ValidateSerializedState(const char *serializedState, const char *fileName, uint32_t line);
|
void ValidateSerializedState(const char *serializedState, const char *fileName, uint32_t line);
|
||||||
#define VALIDATE_CHECKPOINT(STATE) ValidateSerializedState(STATE, __FILE__, __LINE__)
|
#define VALIDATE_CHECKPOINT(STATE) ValidateSerializedState(STATE, __FILE__, __LINE__)
|
||||||
|
|
||||||
|
|
|
@ -119,10 +119,6 @@
|
||||||
6286 : ImageTestES3.Source2DTarget2DTargetTextureRespecifyLevel/ES3_Vulkan_SwiftShader = FAIL
|
6286 : ImageTestES3.Source2DTarget2DTargetTextureRespecifyLevel/ES3_Vulkan_SwiftShader = FAIL
|
||||||
6286 : ImageTestES3.Source2DTargetExternalESSL3/ES3_Vulkan_SwiftShader = FAIL
|
6286 : ImageTestES3.Source2DTargetExternalESSL3/ES3_Vulkan_SwiftShader = FAIL
|
||||||
6286 : ImageTestES3.SourceRenderbufferTargetTextureExternalESSL3/ES3_Vulkan_SwiftShader = FAIL
|
6286 : ImageTestES3.SourceRenderbufferTargetTextureExternalESSL3/ES3_Vulkan_SwiftShader = FAIL
|
||||||
6425 : ObjectAllocationTest.BindFramebufferAfterGen/ES3_Vulkan_SwiftShader = FAIL
|
|
||||||
6425 : ObjectAllocationTest.BindFramebufferBeforeGen/ES3_Vulkan_SwiftShader = FAIL
|
|
||||||
6425 : ObjectAllocationTestES3.BindFramebufferAfterGen/ES3_Vulkan_SwiftShader = FAIL
|
|
||||||
6425 : ObjectAllocationTestES3.BindFramebufferBeforeGen/ES3_Vulkan_SwiftShader = FAIL
|
|
||||||
6512 : RobustResourceInitTestES3.BindTexImage/ES3_Vulkan_SwiftShader = FAIL
|
6512 : RobustResourceInitTestES3.BindTexImage/ES3_Vulkan_SwiftShader = FAIL
|
||||||
6180 WIN : TransformFeedbackTest.DrawWithoutTransformFeedbackThenWith/ES3_Vulkan_SwiftShader = FLAKY
|
6180 WIN : TransformFeedbackTest.DrawWithoutTransformFeedbackThenWith/ES3_Vulkan_SwiftShader = FLAKY
|
||||||
6513 : TransformFeedbackTest.MultiContext/ES3_Vulkan_SwiftShader = FLAKY
|
6513 : TransformFeedbackTest.MultiContext/ES3_Vulkan_SwiftShader = FLAKY
|
||||||
|
|
Загрузка…
Ссылка в новой задаче