| 1203 | } |
| 1204 | |
| 1205 | void QueryPrePostModPixelValues(WrappedOpenGL *driver, GLPixelHistoryResources &resources, |
| 1206 | const rdcarray<EventUsage> &modEvents, int x, int y, |
| 1207 | rdcarray<PixelModification> &history, uint32_t numSamples, |
| 1208 | uint32_t sampleIndex) |
| 1209 | { |
| 1210 | GLMarkerRegion region("QueryPrePostModPixelValues"); |
| 1211 | driver->ReplayLog(0, modEvents[0].eventId, eReplay_WithoutDraw); |
| 1212 | CopyFramebuffer premodCopyFramebuffer = {}; |
| 1213 | premodCopyFramebuffer.framebufferId = ~0u; |
| 1214 | CopyFramebuffer postmodCopyFramebuffer = {}; |
| 1215 | postmodCopyFramebuffer.framebufferId = ~0u; |
| 1216 | int preModLastIdx = 0, postModLastIdx = 0; |
| 1217 | |
| 1218 | for(size_t i = 0; i < modEvents.size(); i++) |
| 1219 | { |
| 1220 | uint32_t colIdx = getFramebufferColIndex(driver, resources.target); |
| 1221 | |
| 1222 | { |
| 1223 | GLint savedReadFramebuffer, savedDrawFramebuffer; |
| 1224 | driver->glGetIntegerv(eGL_DRAW_FRAMEBUFFER_BINDING, &savedDrawFramebuffer); |
| 1225 | driver->glGetIntegerv(eGL_READ_FRAMEBUFFER_BINDING, &savedReadFramebuffer); |
| 1226 | |
| 1227 | GLuint copySourceFramebuffer = savedDrawFramebuffer; |
| 1228 | |
| 1229 | if(isDirectWrite(modEvents[i].usage)) |
| 1230 | { |
| 1231 | copySourceFramebuffer = resources.copySourceFramebuffer; |
| 1232 | |
| 1233 | // bind this as the framebuffer so the below code which expects to duplicate based on bound |
| 1234 | // framebuffer will work. We've already saved teh real one |
| 1235 | driver->glBindFramebuffer(eGL_FRAMEBUFFER, copySourceFramebuffer); |
| 1236 | } |
| 1237 | |
| 1238 | if(numSamples > 1) |
| 1239 | { |
| 1240 | premodCopyFramebuffer = |
| 1241 | getCopyFramebuffer(driver, colIdx, resources.copyFramebuffers, ModType::PreMod, |
| 1242 | numSamples, int(modEvents.size())); |
| 1243 | |
| 1244 | driver->glBindFramebuffer(eGL_DRAW_FRAMEBUFFER, premodCopyFramebuffer.framebufferId); |
| 1245 | driver->glBindFramebuffer(eGL_READ_FRAMEBUFFER, copySourceFramebuffer); |
| 1246 | |
| 1247 | GLenum savedReadBuffer; |
| 1248 | driver->glGetIntegerv(eGL_READ_BUFFER, (GLint *)&savedReadBuffer); |
| 1249 | |
| 1250 | driver->glReadBuffer(GLenum(eGL_COLOR_ATTACHMENT0 + colIdx)); |
| 1251 | SafeBlitFramebuffer(x, y, x + 1, y + 1, 0, 0, 1, 1, getFramebufferCopyMask(driver), |
| 1252 | eGL_NEAREST); |
| 1253 | readPixelValuesMS(driver, resources, premodCopyFramebuffer, sampleIndex, 0, 0, history, i, |
| 1254 | ModType::PreMod, true); |
| 1255 | |
| 1256 | driver->glReadBuffer(savedReadBuffer); |
| 1257 | } |
| 1258 | else |
| 1259 | { |
| 1260 | CopyFramebuffer newCopyFramebuffer = |
| 1261 | getCopyFramebuffer(driver, colIdx, resources.copyFramebuffers, ModType::PreMod, |
| 1262 | 1 /*single sampled*/, int(modEvents.size())); |
no test coverage detected