src/libANGLE/capture/FrameCapture.h


Log

Author Commit Date CI Message
Lubosz Sarnecki f8ddca00 2022-03-03T15:34:15 FrameCapture: Use getCompressedTextImage. Replace retrieveCachedTextureLevel with getCompressedTexImage. Remove compressed texture shadow copy code. Treat GLCopyImageSubData calls as texture updates by handling them in trackTextureUpdate. Bug: angleproject:5592 Bug: angleproject:5604 Bug: angleproject:6104 Bug: angleproject:6177 Bug: b/181797364 Change-Id: Ic6b2a41ce536e3e4b66497048954efdafa556d1e Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3516377 Reviewed-by: Cody Northrop <cnorthrop@google.com> Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: Lubosz Sarnecki <lubosz.sarnecki@collabora.com>
Lubosz Sarnecki ed590dc8 2022-03-11T12:54:44 FrameCapture: Add override for Glsizei* types. Fix capturing glGetSynciv with null lengths on Linux. When calling the default WriteParamValueReplay handler with a nullptr, ostream on Linux will write `(nil)`. This fixes retracing all traces containing glGetSynciv calls with null lengths. Add a NullLength test to FenceSyncTests that used to fail in the capture_replay_tests. Test: capture_replay_tests.py --gtest_filter=FenceSyncTest.NullLength/* Bug: angleproject:7071 Bug: angleproject:6808 Change-Id: I0a2bd4db744ce2a026cd932ba0f2f4747672fcc8 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3526653 Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: Lubosz Sarnecki <lubosz.sarnecki@collabora.com>
Cody Northrop 7b202392 2022-03-02T17:32:45 Capture/Replay: Fix capture on Linux Need to add support for printing "const GLint *" types. We've been falling into the default handler and getting lucky with how other platforms handle ostream with a null value. We use this extensively with glShaderSource(). Test: MEC of an existing trace on Linux Bug: angleproject:7071 Change-Id: I7e4f1fbf2876dddac49ea6583918dbc534070d75 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3501201 Reviewed-by: Gert Wollny <gert.wollny@collabora.com> Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
Cody Northrop c80c7ae3 2022-02-24T10:43:15 Capture/Replay: Merge Deletes in Reset Before this CL, when regenning resources, we would iterate through each resource ID and issue a delete followed by a gen. The delete is required to get resources back to their original state, often caused by applications recreating them during the run. This ran into problems when our resource maps had stale data in them, i.e. a texture that had been deleted by the app but remained in our gTextureMap. We could inadvertently delete a resource we had just genned. For example, in ResetReplay(), say we have two textures to delete: // gTextureMap[1] start with 5 const GLuint glDeleteTextures_texturesPacked_1[] = { gTextureMap[1] }; glDeleteTextures(1, glDeleteTextures_texturesPacked_1); // We just deleted texture 5, now create a new one glGenTextures(1, reinterpret_cast<GLuint *>(gReadBuffer)); // The driver returned 15, which was unused at this time UpdateTextureID(1, 0); // gTextureMap[1] now contains 15 ... // gTextureMap[2] happens to start with 15, which was in use in // the trace, but was deleted and is no longer in use. The // deleted value is not cleared from gTextureMap (which is // another possible way to solve this). const GLuint glDeleteTextures_texturesPacked_2[] = { gTextureMap[2] }; glDeleteTextures(1, glDeleteTextures_texturesPacked_2); // Whoops! We just deleted our brand new texture 15, even though // it no longer maps to the original texture. glGenTextures(1, reinterpret_cast<GLuint *>(gReadBuffer)); UpdateTextureID(2, 0); // Now gTextureMap[2] contains whatever came back from the driver ... // The first use of gTextureMap[1] will fail on loop because // texture 15 no longer exists! To avoid this problem we delete all resources up front before genning any new ones. const GLuint deleteTextures[] = {gTextureMap[1], gTextureMap[2]}; glDeleteTextures(2, deleteTextures); // Now we no longer have any deletes in the create sequence glGenTextures(1, reinterpret_cast<GLuint *>(gReadBuffer)); UpdateTextureID(1, 0); glGenTextures(1, reinterpret_cast<GLuint *>(gReadBuffer)); UpdateTextureID(2, 0); This is applied to all the resources we regen right now. This CL: * Merges the deletion of new resources (that didn't exist when the trace starts) with resources that are being regenned. That means there is just one big delete. * Removes Delete from the call sequences we track for each resource since we no longer need to keep them around. * Adds a formatting helper to avoid code duplication. Test: Blade&Soul Revolution MEC (UE4) Bug: angleproject:4599 Bug: angleproject:7053 Change-Id: Ida3b7e1ad5d94c5e9860447d5cf959278f37ad47 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3492849 Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Gert Wollny <gert.wollny@collabora.com> Commit-Queue: Cody Northrop <cnorthrop@google.com>
Lubosz Sarnecki 287057b3 2022-01-25T17:01:43 FrameCapture: Don't track coherent buffers before capture starts. Even though coherent buffer storages were only captured after capture was activated, the buffer tracker was incorrectly initialized with the first call to glMapBufferRange, even though capture was not active. This fixes corrupted rendering in War Planet Online due to all coherent buffer storages being tracked at initialization of the app, when FrameCapture was enabled but not active. Introduce mMidExecutionCaptureActive, which exposes if MEC is currently executed. Bug: angleproject:5857 Bug: angleproject:6774 Change-Id: I4849d6497e8e08aefc60e68bae027915e9b2912f Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3416227 Reviewed-by: Cody Northrop <cnorthrop@google.com> Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: Lubosz Sarnecki <lubosz.sarnecki@collabora.com>
Lubosz Sarnecki c984dad5 2021-12-03T16:02:49 FrameCapture: Don't remove protection from shared pages. Don't remove protection from pages that are shared when a persistent coherent buffer storage is unmapped. The shared page can still be relevant when the the other buffer is kept and written to. Add a PageSharingBuffers test that produces this behaviour. Test: angle_end2end_tests --gtest_filter="BufferStorageTestES3.PageSharingBuffers/*" Bug: angleproject:5857 Change-Id: I6927f25229d2dfe9f68ba9a993e9d3e994bc7ce0 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3306623 Reviewed-by: Cody Northrop <cnorthrop@google.com> Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: Lubosz Sarnecki <lubosz.sarnecki@collabora.com>
Lubosz Sarnecki d4b8cd5e 2021-09-14T16:34:31 FrameCapture: Implement capture of coherent bufferstorages. Track buffers with the GL_MAP_COHERENT_BIT_EXT access flag in a CoherentBufferTracker on a per page basis using the PageFaultHandler and protection functions from system_utils. Check for dirty memory and capture it on draw calls. Bug: angleproject:5857 Change-Id: Ib098f96952db7583d3e6517570c179e7754f54b2 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3168629 Reviewed-by: Cody Northrop <cnorthrop@google.com> Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: Lubosz Sarnecki <lubosz.sarnecki@collabora.com>
Jamie Madill f60b152c 2021-12-06T10:19:53 Frame Capture: Merge small frames into single sources. By buffering up the replay functions before writing them out into sources, we can reduce the number of replay files by a large margin. Bug: angleproject:5133 Change-Id: I0a556fd1a3a5f2dcc8a26b761e885c9b7e464cf5 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3316200 Reviewed-by: Cody Northrop <cnorthrop@google.com> Reviewed-by: Tim Van Patten <timvp@google.com> Commit-Queue: Jamie Madill <jmadill@chromium.org>
Jamie Madill e8b186c9 2021-12-09T09:45:20 Frame Capture: Don't unmap regenned buffers in reset. These buffers are deleted and recreated, so unmapping them gives a "resource not mapped" error during replay. Found when working on the "world_war_doh" trace. Bug: angleproject:5133 Change-Id: Id1e6318c44a2a09fa643ef0a72f1d03d8396e5fb Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3327862 Reviewed-by: Tim Van Patten <timvp@google.com> Reviewed-by: Cody Northrop <cnorthrop@google.com> Commit-Queue: Jamie Madill <jmadill@chromium.org>
Jamie Madill d02d6a40 2021-12-06T09:26:14 Frame Capture: Track written files in ReplayWriter. This means we don't need to recreate the list of written files in the JSON where we list the trace files. It will allow for more flexibility when we change what trace files we output. Bug: angleproject:5133 Change-Id: I651b6a281c50040d32361a5a020ba3eaa4241bf0 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3316199 Reviewed-by: Cody Northrop <cnorthrop@google.com> Reviewed-by: Tim Van Patten <timvp@google.com> Commit-Queue: Jamie Madill <jmadill@chromium.org>
Jamie Madill 0f09d378 2021-12-07T13:32:39 Frame Capture: Track return value in max resource IDs. This adds handling for return value processing when it comes to maximum resource IDs. Specifically for glCreateShader and glCreateProgram. Fixes MEC with re-capture with the blockman_go and probably other traces that call CreateShader as the final operations during setup. Bug: angleproject:5133 Change-Id: I799dfec776ca8c80a0b89c7f0c7c23423ef3896a Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3320887 Reviewed-by: Cody Northrop <cnorthrop@google.com> Reviewed-by: Tim Van Patten <timvp@google.com> Commit-Queue: Jamie Madill <jmadill@chromium.org>
Jamie Madill 8313ffe2 2021-11-29T15:46:25 FrameCapture: Add ReplayWriter helper class. This centralizes all of the replay file I/O into a single point. Each function is stored separately in this class. Right now there's some small file format changes: - the namespaces for the capture label are gone. these had no functional impact now that each trace was a separate module. - the header is cleaned up into private and public functions. this cleans up a few things like defining non-existent functions. - inline variables are tracked through the replay. they are now global instead of anonymous, and string sets get reused instead of duplicated between frames. There should be no functional changes with the naming of the trace files or the trace behaviour. This change sets the stage for the ReplayWriter buffering multiple frames into a single cpp file on disk, which can potentially reduce the number of object files in the compilation by a great deal. It could also be extended to work with buffered I/O so we don't block and hitch when we're writing large trace files. Bug: angleproject:5133 Change-Id: Ib96685e1202ac8101a4b828fa79642236af2120a Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3311940 Reviewed-by: Cody Northrop <cnorthrop@google.com> Reviewed-by: Tim Van Patten <timvp@google.com> Commit-Queue: Jamie Madill <jmadill@chromium.org>
Gert Wollny 3b6f80b7 2021-11-23T10:07:43 Capture/Replay: eliminate redundant parameters in GenOnBind The template parameter already defines the parameter value name and the parameter value type, so add some traits to simplify the call interface of the function. Bug: angleproject:6425 Change-Id: I037bed8e5cc2e7367d8faa3af5d4fba2bfbb52c3 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3295617 Commit-Queue: Gert Wollny <gert.wollny@collabora.com> Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Cody Northrop <cnorthrop@google.com>
Gert Wollny 1d555687 2021-11-09T11:16:24 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>
Gert Wollny bb5dbd49 2021-10-05T11:57:44 Capture/Replay: Handle TvoidPointer in specialization Bug: angleproject:6521 Change-Id: I863ad5307498e6394f5fbe3e650ce29c821083b1 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3204960 Commit-Queue: Gert Wollny <gert.wollny@collabora.com> Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Cody Northrop <cnorthrop@google.com>
Jamie Madill 043120ee 2021-09-29T15:56:46 Capture/Replay: Allow disabling program trimming. The ANGLE_CAPTURE_TRIM_ENABLED variable disables program trimming when set to 0. This is useful for trace validation, which expects the GL state vectors to be identical. Bug: angleproject:5133 Change-Id: I3ab41de80af7b223c4cb8a1b7e14f049717305fc Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3193417 Reviewed-by: Tim Van Patten <timvp@google.com> Reviewed-by: Cody Northrop <cnorthrop@google.com> Commit-Queue: Jamie Madill <jmadill@chromium.org>
Cody Northrop 3719c172 2021-09-20T17:33:14 FrameCapture: Filter program setup calls This CL adds filtering to shared setup calls based on whether a resource is used during the frame capture. Calls that are filtered out will not be written to SetupReplayContextShared. This eliminates setup for unused resources. This has become critical for apps like Fortnite that compile tens of thousands of programs before running any frames. This can take multiple minutes to perform before rendering a frame. To achieve this, we do the following: - Add an active status to every call (default to TRUE). - Mark setup calls for tracked resources to FALSE during MEC. - During the run, track for any use of the resource, and mark its setup calls back to TRUE. - Enable tracking for ShaderPrograms. Test: Fortnite MEC Bug: b/180418810 Bug: angleproject:5658 Change-Id: I5070297d339de3b80f870640e8955077a2bc20aa Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3150387 Commit-Queue: Cody Northrop <cnorthrop@google.com> Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Tim Van Patten <timvp@google.com>
YuxinHu a09dca68 2021-09-20T23:40:28 Fix app trace heap buffer overflow During runMidExecutionCapture(), we need to update mMaxAccessedResourceIDs[idType] for idType==ShaderProgram, so that we have enought slot in gShaderProgramMap2 to store the temp shader we create in GenerateLinkedProgram(). Changes in this CL: 1.Renaming Jamie's mMaxAccessResourceIDS array update function updatePreCallResourceCounts() to updateResourceCounts(). 2. Adding updateResourceCounts() to Cody's setup call post processing function scanSetupCalls(). In GenerateLinkedProgram(), we add the temp shader create call with its' tempShaderID into the shareGroupSetupCalls. After that we will run the function scanSetupCalls(), where we will be able to loop through the tempShaderID and update the mMaxAccessResourceIDS[ShaderProgram] with the correct count. Bug: angleproject:6398 Change-Id: Iee78b3b7c1908a90ee8456476902f5e52e4615dc Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3172005 Reviewed-by: Cody Northrop <cnorthrop@google.com> Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: Yuxin Hu <yuxinhu@google.com>
Cody Northrop 0babcb08 2021-09-14T10:49:06 FrameCapture: Scan Setup instructions The ability to add calls from a multitude of locations rather than a centralized spot has become a useful feature. But some locations were updating the max read buffer size via updateReadBufferSize, while others weren't. Rather than force everything to call a central spot for tracking, add post process scanning of Setup calls to handle updates. This is already done for frame calls in maybeCapturePreCallUpdates. Test: Fortnite MEC Bug: b/180418810 Bug: angleproject:5658 Change-Id: I51d3a39ea40073d2dca50339ef4b38712b81f4ca Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3160500 Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Tim Van Patten <timvp@google.com> Commit-Queue: Cody Northrop <cnorthrop@google.com>
Jamie Madill c12d2f37 2021-09-09T12:11:14 Capture/Replay: Remove unused function in header. Bug: angleproject:5133 Change-Id: I80f22d95101263f2ff37835c9e0f634b96d41622 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3150258 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: Tim Van Patten <timvp@google.com>
Jamie Madill c5a38976 2021-09-01T07:35:40 Capture/Replay: Add expression trigger validation calls. Setting the environment variable "ANGLE_CAPTURE_VALIDATION_EXPR" will make ANGLE's capture logic evaluate this expression every captured call to see if it should insert a validation checkpoint. The retracing script also accepts --validation-expr as an argument. For instance, the expression: ((frame == 2) && (call < 1189) && (call > 1100) && ((call % 5) == 0)) Will insert validation checkpoints on frame 2, between calls 1100 and 1189 and will validate every 5th call. The 'call' here is the count of captured calls, which are mostly GL calls with a few ANGLE replay calls in the mix. We add a small single-header library that can evaluate arthithmetic expressions in order to parse these expressions, as well as an option to the retracing script. Bug: angleproject:5133 Change-Id: Ic369e85d8e905a3a7a32fa098f7d8ebe7baf4ab9 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3136094 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: Tim Van Patten <timvp@google.com> Reviewed-by: Cody Northrop <cnorthrop@google.com>
Gert Wollny 349d555d 2021-09-02T10:07:26 Capture/Replay: handle glGetBooleani_v This also fixes a test. Bug: angleproject:6180 Change-Id: Icad2d089738f4458c90b87620337e9798adb9141 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3139898 Reviewed-by: Cody Northrop <cnorthrop@google.com> Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: Gert Wollny <gert.wollny@collabora.com>
Jamie Madill ec8418da 2021-07-02T09:55:39 Capture/Replay: Use plain arrays for resource maps. Instead of using the templated wrapper class, use C++ arrays that are dynamically allocated with "new". This saves a fair bit of binary size spent in calling the operator[] function. To get the right size this CL adds tracking to the capture for each resource type, then updates trace initialization to store the maximum allocated resource ID for each type. Tested with Manhattan 3.0: on Windows with Release, binary size for the trace shared object went from 7.053 MB to 6.125 MB. About a 13% decrease in binary size. That will allow for longer captures and will also reduce trace overhead. Bug: angleproject:5133 Change-Id: I2cd7515262a9ec76112d5f790001e3a6e9acd3a9 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3003383 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: Cody Northrop <cnorthrop@google.com> Reviewed-by: Gert Wollny <gert.wollny@collabora.com> Reviewed-by: Tim Van Patten <timvp@google.com>
Jamie Madill 9c05f55a 2021-07-15T10:58:10 Capture/Replay: Add replay state validation. We can use this to validate traces that have slight differences when retracing. The valdation works by embedding the "expected" JSON into a string at the end of each captured frame. The replay also embeds a callback which fires right before the swap in the replay harness. The harness then gets the "actual" JSON and runs a comparison. On a mismatch it calls "diff" externally. Currently the diff call is hard-coded to work on Linux only. Note that when running validation it's important to replay on SwiftShader since that's what we use to retrace. Bug: angleproject:5133 Change-Id: Icbf0031d07be8bd916607c537dec235f9a512c43 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3066008 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: Tim Van Patten <timvp@google.com> Reviewed-by: Cody Northrop <cnorthrop@google.com>
Tim Van Patten 58bb11ca 2021-04-16T12:28:50 Capture/Replay: Multi-Context Support Add support for capturing and replaying multiple contexts. 1.) Create and initialize the Contexts in the share group during SetupReplay(). 2.) Track the Context the command stream is for, and if the Context ID changes, inject an eglMakeCurrent() call to switch to the new Context. 3.) Intercept eglCreateContext() and eglMakeCurrent() to route to either EGLWindow or WGLWindow, depending on the current platform. Specifically, this enables capturing and replaying Asphalt 9. Bug: angleproject:5878 Change-Id: I5bc9b7ece5388ce405ba3f9e9dc3967e78662000 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2830145 Commit-Queue: Tim Van Patten <timvp@google.com> Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Cody Northrop <cnorthrop@google.com>
Cody Northrop 5f092f8b 2021-08-17T17:15:59 FrameCapture: Support glProgramBinary This CL allows applications to use glProgramBinary. Normally this is a problem because we need program source in order to recreate shaders in use during mid-execution capture. Use of program binaries means an app can start and render frames without having submitted source for that run. To support this, we will embed program source into ANGLE's binary format. This will allow us to extract it when the app submits the binary. We will only embed this when capture is enabled to prevent increased binary size in the common case. Since this changes ANGLE's binary format, apps will recreate binaries when capture is enabled. Additionally, we can't allow captures to have glProgramBinary calls in the middle of captured frame ranges, so intercept those calls and replace with a full linking sequence. Changes include: - Add new frontend feauture enableProgramBinaryForCapture that allows OES_get_program_binary during capture. - Update ANGLE's binary format to include program source when capture is enabled. - Update maybeOverrideEntryPoint to handle multiple new calls instead of a single call. - Override calls to glProgramBinary that occur mid-capture to instead emit a full GenerateLinkedProgram sequence. - Add checks for created/attached shaders during FrameCapture since they won't be available for programs populated by the app using glProgramBinary. Test: Fortnite MEC Bug: b/180418810 Bug: angleproject:5658 Change-Id: Ib2a0e9e434d3ee0f384d128c48b2a7d4834f5b0f Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3105390 Commit-Queue: Cody Northrop <cnorthrop@google.com> Reviewed-by: Tim Van Patten <timvp@google.com> Reviewed-by: Jamie Madill <jmadill@chromium.org>
Jamie Madill 839d5318 2021-08-16T08:29:28 Capture/Replay: Changes to MEC first frame capture. Recent changes made it so it was impossible to trigger MEC *after* the first frame and *before* the second frame. Instead it was only possible to capture *before* the first frame or *after* the second frame. Makes it possible for the retracing script to do identical captures. Also includes a number of refactorings to make it simpler to follow the code, including renaming methods, and removing some extra output files. Bug: angleproject:5133 Change-Id: Ice6a189eb9f4d53e8ee1ba39beb537af2ef5fd9f Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3097807 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: Tim Van Patten <timvp@google.com> Reviewed-by: Cody Northrop <cnorthrop@google.com>
Jamie Madill ad286e71 2021-08-17T10:43:47 Capture/Replay: Clean up ResourceTracker access. This reduces the boilerplate needed to tracked genned/deleted resources. Refactoring change only. Bug: angleproject:5133 Change-Id: I81f8877b2c308fe9d4136999f3ca63371a070720 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3100591 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: Tim Van Patten <timvp@google.com> Reviewed-by: Cody Northrop <cnorthrop@google.com>
Tim Van Patten 62cac8b5 2021-08-06T18:24:52 Capture/Replay: Add EGL support to generate_entry_points.py Add EGL support to generate_entry_points.py. This is a pre-requisite to frame capture being able to generate EGL calls, which is required for multi-context support. Bug: angleproject:5878 Bug: angleproject:4035 Change-Id: I3b8e9c91f9e2820b5207fc02d858e8109921f581 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3078993 Commit-Queue: Tim Van Patten <timvp@google.com> Reviewed-by: Cody Northrop <cnorthrop@google.com> Reviewed-by: Jamie Madill <jmadill@chromium.org>
Tim Van Patten 3fd572c4 2021-08-04T12:45:09 FrameCapture: Fix setCaptureActive() and MEC timing Frame capture is currently off by one when calling setCaptureActive() and collecting the mid-execution capture state. The MEC state is collected at frame N, but setCaptureActive() isn't called until frame N+1, meaning all of the maybeCapturePreCallUpdates() and maybeCapturePostCallUpdates() calls are not tracking resources correctly for frame N. This CL fixes when setCaptureActive() is called relative to when setupSharedAndAuxReplay() is called, so the trace is active for the first frame and all of the resources are correctly tracked. Additionally, setCaptureActive() during the FrameCaptureShared() ctor if frame capture starts with the first frame. Bug: angleproject:6225 Change-Id: Id07e78b2da9c9d33779e20ab6a42f63cd103a6a6 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3071940 Reviewed-by: Cody Northrop <cnorthrop@google.com> Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: Tim Van Patten <timvp@google.com>
Jamie Madill 35bdaf8d 2021-08-03T08:12:26 Capture/Replay: Minor cleanups. Removes a duplicate assignment to the enabled variable. In the cpp it's set to true, and in the header it was false. Also updates a few variable names to be consistent with the group. Bug: angleproject:5133 Change-Id: I3fb00ecc474191bea7c3a650ce23805b6f02d667 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3066007 Reviewed-by: Tim Van Patten <timvp@google.com> Commit-Queue: Jamie Madill <jmadill@chromium.org>
Lubosz Sarnecki 262dc97c 2021-07-27T11:13:59 FrameCapture: Capture the EGL color space. Add a SurfaceParams struct containing extents and color space so a single map can be used for all draw surface parameters. Persist the color space in the trace's header. Bug: angleproject:5857 Change-Id: I327da8c8870f2d76d057954af57d977a10ebb59f Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3056371 Commit-Queue: Lubosz Sarnecki <lubosz.sarnecki@collabora.com> Reviewed-by: Cody Northrop <cnorthrop@google.com> Reviewed-by: Jamie Madill <jmadill@chromium.org>
Cody Northrop b5630d5c 2021-07-19T20:39:02 Capture/Replay: Add textures to resource tracking This CL: - Shifts resource reset tracking to be stored in an array of structs indexed by type. This helps curb the complexity of adding more resource types. - Moves buffer and program tracking to the new layout. - Adds textures to the resource tracker, using new layout. Note that only aspects common to all ResourceIDTypes have been moved to the new layout. Unique pieces of data, like buffer mapping state and GLSync handling, remain in resource tracker alone. Since texture setup is quite involved, this CL takes the approach of having each call applied to two call chains at the same time; SetupReplay calls and ResetReplay calls. ResetReplay ends up with a sequence similar to buffers: ... const GLuint deleteTextures[] = { gTextureMap[1], gTextureMap[2], ... gTextureMap[n]}; glDeleteTextures(<count>, deleteTextures); ... glGenTextures(1, reinterpret_cast<GLuint *>(gReadBuffer)); UpdateTextureID(1, 0); glGenTextures(1, reinterpret_cast<GLuint *>(gReadBuffer)); UpdateTextureID(2, 0); glGenTextures(1, reinterpret_cast<GLuint *>(gReadBuffer)); UpdateTextureID(3, 0); ... glBindTexture(GL_TEXTURE_2D, gTextureMap[1]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, 9729); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, 33071); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, 33071); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, 33071); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, 519); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0); glTexImage2D(GL_TEXTURE_2D, 0, 6406, 512, 512, 0, GL_ALPHA, GL_UNSIGNED_BYTE, reinterpret_cast<const GLubyte *>(&gBinaryData[183263280])); glBindTexture(GL_TEXTURE_2D, gTextureMap[2]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, 9987); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, 519); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 6); glTexStorage2D(GL_TEXTURE_2D, 7, GL_COMPRESSED_SRGB8_ETC2, 64, 64); ... Test: PUBG Mobile MEC Bug: b/180418573 Bug: angleproject:6087 Change-Id: I9f8e151c12aec5b2b7af376b8e0ff644ff9c61c4 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3016114 Commit-Queue: Cody Northrop <cnorthrop@google.com> Reviewed-by: Tim Van Patten <timvp@google.com> Reviewed-by: Jamie Madill <jmadill@chromium.org>
Gert Wollny 1e75181f 2021-07-15T13:39:08 Capture/Replay: redesign capturing of arrays passed by pointer Instead of doing a lookup of the number of passes array when the call is written, store the number of array values in the ParamCapture when the call is captured. Bug: angleproject:6164 Change-Id: I87b0e2f776a6884b999cc50844e0777cda26b380 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3031543 Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Cody Northrop <cnorthrop@google.com> Commit-Queue: Gert Wollny <gert.wollny@collabora.com>
Tim Van Patten 223cd0ac 2021-06-15T18:46:07 Capture/Replay: Refactor shared context handling This is the initial CL to enable capture/replay of multi-context applications. This CL refactors FrameCapture and FrameCaptureShared to move much of the functionality into FrameCaptureShared, since most everything is shared by Contexts in the share group. For example, the setup of the majority of the GL objects is done in the new SetupReplayContextShared() function in the new $LABEL_capture_context_shared_frame001.cpp file. The setup is performed by (for example): void SetupReplay() { $LABEL::InitReplay(); $LABEL::SetupReplayContextShared(); SetupReplayContext2(); } This performs the shared setup first, followed by the context-specific setup, which may reference shared objects careated by LABEL::SetupReplayContextShared(). No re-capturing is required with this change, since the external APIs (i.e., SetupReplay()) are still the same. Bug: angleproject:5878 Test: Manual MEC and replay of Magic Tiles 3, Candy Crush Soda Saga, Temple Run 2 Change-Id: Iab7bfe651437e9be1dee83514cd97acc20c61d1d Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2965780 Commit-Queue: Tim Van Patten <timvp@google.com> Reviewed-by: Cody Northrop <cnorthrop@google.com> Reviewed-by: Jamie Madill <jmadill@chromium.org>
Gert Wollny 5fb5f63b 2021-06-29T09:56:43 Capture: Write captured context for empty frames When a frame is empty, still write the captured context for that frame because the index file will contain the frame file, and the replay will execute the according swapbuffer so that the replay will query the context serialization when testing trace correctness. With that enable RobustResourceInitTest.SurfaceInitializedAfterSwap/* for capture/replay. Bug: angleproject:5939 Change-Id: Ib280d55f739cc2bb8d2da0919e98c37a2cd576ba Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2987991 Commit-Queue: Gert Wollny <gert.wollny@collabora.com> Reviewed-by: Cody Northrop <cnorthrop@google.com> Reviewed-by: Jamie Madill <jmadill@chromium.org>
Cody Northrop aec47ff6 2021-06-22T15:47:43 Capture/Replay: Update CopyImageSubData params The parameters to glCopyImageSubData are flexible and can take a TextureID or a RenderbufferID as a GLuint. Our replay needs to remap those values, so we'll convert the GLuint based on the target. This leads to a change like the following. Before: glCopyImageSubData(138, 0x0DE1, 0, 0, 0, 0, 642, 0x0DE1, 1, 0, 0, 0, 256, 256, 1); After: glCopyImageSubData(gTextureMap[138], 0x0DE1, 0, 0, 0, 0, gTextureMap[642], 0x0DE1, 1, 0, 0, 0, 256, 256, 1); Test: PUBG Mobile MEC Bug: angleproject:6087 Bug: angleproject:6104 Change-Id: I5cd422e41ffbb4f08c8909e520bdce63e3008c5a Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2981464 Commit-Queue: Cody Northrop <cnorthrop@google.com> Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Tim Van Patten <timvp@google.com>
Gert Wollny c8677c73 2021-06-12T17:23:42 Capture: Add a specialization for const GLuint * Bug: angleproject:6058 Change-Id: I31cad1dd23d313aae625874e140c406747e0f4c4 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2957953 Reviewed-by: Cody Northrop <cnorthrop@google.com> Reviewed-by: Jamie Madill <jmadill@chromium.org>
Gert Wollny 78437770 2021-06-12T15:48:26 Capture: read four values for GL_TEXTURE_CROP_RECT_OES This texture parameter describes a cropping region x,y, width, height. Bug: angleproject:6057 Change-Id: I2c71f6aec1e536f42e06c19cb025889094b57a35 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2956510 Reviewed-by: Cody Northrop <cnorthrop@google.com> Reviewed-by: Jamie Madill <jmadill@chromium.org>
Gert Wollny 22716d31 2021-06-11T13:51:41 Capture: Add specialization for ParamType::TGLubyte Also enable "CurrentColorTest.Set/*" tests. Bug: angleproject:6049 Change-Id: I65e62b6c0805687ad6744a12217e0c08bc97ca1a Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2954262 Commit-Queue: Gert Wollny <gert.wollny@collabora.com> Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Cody Northrop <cnorthrop@google.com>
Gert Wollny 90f9ddd9 2021-06-10T14:35:13 Capture: Add support for capturing (Get)ClipPlanef equation In addition, correctly handle "const GLfloat *" when replaying, and enable the according capture/replay tests Bug: angleproject:6047 Change-Id: I5dd7510d1b621d4c941490c9d0261559a96dd681 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2951133 Commit-Queue: Gert Wollny <gert.wollny@collabora.com> Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Cody Northrop <cnorthrop@google.com>
Gert Wollny cb4f8a79 2021-06-08T10:39:47 Capture: Add a specialization for TGLeglImageOES When writing out the parameter TGLeglImageOES an additional cast is needed. Bug: angleproject:6036 Change-Id: I7470a58a6ae17b0185d0c2e3fe1184b698f3efaf Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2944952 Reviewed-by: Cody Northrop <cnorthrop@google.com> Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: Gert Wollny <gert.wollny@collabora.com>
Gert Wollny 421c665c 2021-05-13T21:17:16 Capture: Make writeCppReplayIndexFiles a method of FrameCapture This is useful to not pass a large amount of parameters around. Bug: angleproject:5965 Change-Id: I3890a0ca852729bbf74725fb9e5f4062e20e9158 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2894485 Commit-Queue: Gert Wollny <gert.wollny@collabora.com> Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Cody Northrop <cnorthrop@google.com>
Cody Northrop 8ea11eb7 2021-05-13T15:54:41 Capture/Replay: Reset programs on loop Apps that create new programs during the run need to have them deleted on loop. This CL handles that. It does not handle programs that have been deleted and need to be recreated, or that have been modified otherwise. An assert has been included to catch that for future needs. With this CL, entries like this will show up in ResetReplay: ... glDeleteProgram(gShaderProgramMap[120]); glDeleteProgram(gShaderProgramMap[121]); ... Test: Pokemon Go MEC Bug: b/188091629 Bug: angleproject:5968 Change-Id: I78c425e8fe95792fc626484641d067613dfae971 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2895326 Commit-Queue: Cody Northrop <cnorthrop@google.com> Reviewed-by: Tim Van Patten <timvp@google.com> Reviewed-by: Jamie Madill <jmadill@chromium.org>
Tim Van Patten 7444466c 2021-04-19T18:44:13 Reland "Capture/Replay: Reset GL Fence Sync objects" This is a reland of 9b4fd5456e3cc8c5412af96212d2840b422208b5 This fixes the original CL by moving where setCaptureActive() is called to allow the first replay source file to be written. Original change's description: > Capture/Replay: Reset GL Fence Sync objects > > Asphalt 9 uses GL Fence Sync objects during rendering, which results in > Fence Sync objects being created during setup and deleted while > replaying frames. When the replay is restarted, the Fence Sync objects > that were created during setup and deleted during the replay need to be > recreated during the reset phase. > > Bug: angleproject:5883 > Bug: angleproject:4599 > Change-Id: I118f2b7208c4d512ab646b10f52b3a0936895089 > Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2838237 > Commit-Queue: Tim Van Patten <timvp@google.com> > Reviewed-by: Cody Northrop <cnorthrop@google.com> > Reviewed-by: Jamie Madill <jmadill@chromium.org> Bug: angleproject:5883 Bug: angleproject:4599 Bug: angleproject:5900 Change-Id: I5e1d901d8875007691699b7b973f3fb7db027337 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2850758 Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: Tim Van Patten <timvp@google.com>
Jamie Madill 3839fa5b 2021-04-26T13:08:15 Revert "Capture/Replay: Reset GL Fence Sync objects" This reverts commit 9b4fd5456e3cc8c5412af96212d2840b422208b5. Reason for revert: Breaks capture: INFO:root:Passed: 0, Comparison Failed: 0, Crashed: 0, CompileFailed 0, Skipped: 745, Timeout: 0 Bug: angleproject:5900 Original change's description: > Capture/Replay: Reset GL Fence Sync objects > > Asphalt 9 uses GL Fence Sync objects during rendering, which results in > Fence Sync objects being created during setup and deleted while > replaying frames. When the replay is restarted, the Fence Sync objects > that were created during setup and deleted during the replay need to be > recreated during the reset phase. > > Bug: angleproject:5883 > Bug: angleproject:4599 > Change-Id: I118f2b7208c4d512ab646b10f52b3a0936895089 > Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2838237 > Commit-Queue: Tim Van Patten <timvp@google.com> > Reviewed-by: Cody Northrop <cnorthrop@google.com> > Reviewed-by: Jamie Madill <jmadill@chromium.org> Bug: angleproject:5883 Bug: angleproject:4599 Change-Id: I56c682e1d90dcdde7b18c941aad976825de3af42 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2851057 Reviewed-by: Jamie Madill <jmadill@chromium.org> Bot-Commit: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com> Commit-Queue: Jamie Madill <jmadill@chromium.org>
Tim Van Patten 9b4fd545 2021-04-19T18:44:13 Capture/Replay: Reset GL Fence Sync objects Asphalt 9 uses GL Fence Sync objects during rendering, which results in Fence Sync objects being created during setup and deleted while replaying frames. When the replay is restarted, the Fence Sync objects that were created during setup and deleted during the replay need to be recreated during the reset phase. Bug: angleproject:5883 Bug: angleproject:4599 Change-Id: I118f2b7208c4d512ab646b10f52b3a0936895089 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2838237 Commit-Queue: Tim Van Patten <timvp@google.com> Reviewed-by: Cody Northrop <cnorthrop@google.com> Reviewed-by: Jamie Madill <jmadill@chromium.org>
Tim Van Patten fbfecbe2 2021-04-07T11:26:13 Capture/Replay: Add PPO/glProgramUniform support Command and Conquer: Rivals requires additional frame capture API support: - Program Pipeline Objects - glProgramUniform* Bug: angleproject:5830 Change-Id: I159086f92d2dfead0a513cd17fadeda7df92f408 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2809891 Commit-Queue: Tim Van Patten <timvp@google.com> Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Cody Northrop <cnorthrop@google.com>
Lubosz Sarnecki fddbc9c7 2021-03-04T20:45:01 capture: Implement capturing GLES1 vertex pointers. Implement capturing glVertexPointer, glTexCoordPointer, glNormalPointer, glColorPointer and glPointSizePointerOES using a new CaptureVertexPointerGLES1 helper function. This is done by using fixed indices for gClientArrays that are retrieved from the GLES1Renderer. Bug: angleproject:5751 Change-Id: I6c774ff21942ea3422c4c77a615f88299901c0ab Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2773288 Reviewed-by: Cody Northrop <cnorthrop@google.com> Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: Lubosz Sarnecki <lubosz.sarnecki@collabora.com>
Cody Northrop a70a6a9d 2021-03-09T10:38:13 Capture/Replay: Fix compressed cube textures We were only tracking one image per level of cube map textures. Instead, we need to track one per face (6). Test: MEC for Extreme Car Driving Simulator Bug: b/180419767 Bug: angleproject:5735 Change-Id: I59e6a5e83a60666a29f44d0a1e1993a1b461e8e7 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2744293 Reviewed-by: Tim Van Patten <timvp@google.com> Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: Cody Northrop <cnorthrop@google.com>
Jamie Madill 6fc10389 2021-02-10T11:20:16 Move Frame Capture to capture/ folder. This will make it easier to trigger the trace tests when these files are modified. Bug: angleproject:5530 Change-Id: I5f0c450595b380cd91b20c1477dc1845bee35dd9 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2686120 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: Tim Van Patten <timvp@google.com> Reviewed-by: Cody Northrop <cnorthrop@google.com>