| 888 | } |
| 889 | |
| 890 | rdcarray<EventUsage> QueryModifyingEvents(WrappedOpenGL *driver, GLPixelHistoryResources &resources, |
| 891 | const rdcarray<EventUsage> &events, int x, int y, |
| 892 | int mipLevel, rdcarray<PixelModification> &history) |
| 893 | { |
| 894 | GLMarkerRegion region("QueryModifyingEvents"); |
| 895 | rdcarray<EventUsage> modEvents; |
| 896 | rdcarray<GLuint> occlusionQueries; |
| 897 | std::set<uint32_t> ignoredEvents; |
| 898 | occlusionQueries.resize(events.size()); |
| 899 | driver->glGenQueries((GLsizei)occlusionQueries.size(), occlusionQueries.data()); |
| 900 | |
| 901 | driver->ReplayLog(0, events[0].eventId, eReplay_WithoutDraw); |
| 902 | // execute the occlusion queries |
| 903 | for(size_t i = 0; i < events.size(); i++) |
| 904 | { |
| 905 | uint32_t colIdx = getFramebufferColIndex(driver, resources.target); |
| 906 | |
| 907 | bool ignored = false; |
| 908 | int objectType; |
| 909 | driver->glGetFramebufferAttachmentParameteriv( |
| 910 | eGL_DRAW_FRAMEBUFFER, GLenum(eGL_COLOR_ATTACHMENT0 + colIdx), |
| 911 | eGL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &objectType); |
| 912 | // Ignore the event if the framebuffer is attached to a different mip level than the one we're |
| 913 | // interested in |
| 914 | if(objectType == eGL_TEXTURE && events[i].usage != ResourceUsage::Clear && |
| 915 | !isDirectWrite(events[i].usage)) |
| 916 | { |
| 917 | int attachedMipLevel; |
| 918 | driver->glGetFramebufferAttachmentParameteriv( |
| 919 | eGL_DRAW_FRAMEBUFFER, GLenum(eGL_COLOR_ATTACHMENT0 + colIdx), |
| 920 | eGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, &attachedMipLevel); |
| 921 | if(mipLevel != attachedMipLevel) |
| 922 | { |
| 923 | ignoredEvents.insert(events[i].eventId); |
| 924 | ignored = true; |
| 925 | } |
| 926 | } |
| 927 | if(!ignored && !(events[i].usage == ResourceUsage::Clear || isDirectWrite(events[i].usage))) |
| 928 | { |
| 929 | GLRenderState state; |
| 930 | state.FetchState(driver); |
| 931 | |
| 932 | GLint currentProgram = 0; |
| 933 | driver->glGetIntegerv(eGL_CURRENT_PROGRAM, ¤tProgram); |
| 934 | |
| 935 | if(!IsGLES) |
| 936 | driver->glEnable(eGL_DEPTH_CLAMP); |
| 937 | if(HasExt[EXT_depth_bounds_test]) |
| 938 | driver->glDisable(eGL_DEPTH_BOUNDS_TEST_EXT); |
| 939 | driver->glDisable(eGL_DEPTH_TEST); |
| 940 | driver->glDisable(eGL_STENCIL_TEST); |
| 941 | driver->glDisable(eGL_CULL_FACE); |
| 942 | driver->glDisable(eGL_SAMPLE_MASK); |
| 943 | driver->glEnable(eGL_SCISSOR_TEST); |
| 944 | driver->glScissor(x, y, 1, 1); |
| 945 | driver->glUseProgram(GetFixedColProgram(driver, driver->GetReplay(), resources, currentProgram)); |
| 946 | |
| 947 | driver->SetFetchCounters(true); |
no test coverage detected