gl_graphics_pipeline: GLASM: Fix transform feedback with multiple buffers
This commit is contained in:
		@@ -559,15 +559,13 @@ void GraphicsPipeline::ConfigureImpl(bool is_indexed) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void GraphicsPipeline::ConfigureTransformFeedbackImpl() const {
 | 
			
		||||
    glTransformFeedbackStreamAttribsNV(num_xfb_attribs, xfb_attribs.data(), num_xfb_strides,
 | 
			
		||||
                                       xfb_streams.data(), GL_INTERLEAVED_ATTRIBS);
 | 
			
		||||
    glTransformFeedbackAttribsNV(num_xfb_attribs, xfb_attribs.data(), GL_SEPARATE_ATTRIBS);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void GraphicsPipeline::GenerateTransformFeedbackState() {
 | 
			
		||||
    // TODO(Rodrigo): Inject SKIP_COMPONENTS*_NV when required. An unimplemented message will signal
 | 
			
		||||
    // when this is required.
 | 
			
		||||
    GLint* cursor{xfb_attribs.data()};
 | 
			
		||||
    GLint* current_stream{xfb_streams.data()};
 | 
			
		||||
 | 
			
		||||
    for (size_t feedback = 0; feedback < Maxwell::NumTransformFeedbackBuffers; ++feedback) {
 | 
			
		||||
        const auto& layout = key.xfb_state.layouts[feedback];
 | 
			
		||||
@@ -575,15 +573,6 @@ void GraphicsPipeline::GenerateTransformFeedbackState() {
 | 
			
		||||
        if (layout.varying_count == 0) {
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
        *current_stream = static_cast<GLint>(feedback);
 | 
			
		||||
        if (current_stream != xfb_streams.data()) {
 | 
			
		||||
            // When stepping one stream, push the expected token
 | 
			
		||||
            cursor[0] = GL_NEXT_BUFFER_NV;
 | 
			
		||||
            cursor[1] = 0;
 | 
			
		||||
            cursor[2] = 0;
 | 
			
		||||
            cursor += XFB_ENTRY_STRIDE;
 | 
			
		||||
        }
 | 
			
		||||
        ++current_stream;
 | 
			
		||||
 | 
			
		||||
        const auto& locations = key.xfb_state.varyings[feedback];
 | 
			
		||||
        std::optional<u32> current_index;
 | 
			
		||||
@@ -619,7 +608,6 @@ void GraphicsPipeline::GenerateTransformFeedbackState() {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    num_xfb_attribs = static_cast<GLsizei>((cursor - xfb_attribs.data()) / XFB_ENTRY_STRIDE);
 | 
			
		||||
    num_xfb_strides = static_cast<GLsizei>(current_stream - xfb_streams.data());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void GraphicsPipeline::WaitForBuild() {
 | 
			
		||||
 
 | 
			
		||||
@@ -154,9 +154,7 @@ private:
 | 
			
		||||
 | 
			
		||||
    static constexpr std::size_t XFB_ENTRY_STRIDE = 3;
 | 
			
		||||
    GLsizei num_xfb_attribs{};
 | 
			
		||||
    GLsizei num_xfb_strides{};
 | 
			
		||||
    std::array<GLint, 128 * XFB_ENTRY_STRIDE * Maxwell::NumTransformFeedbackBuffers> xfb_attribs{};
 | 
			
		||||
    std::array<GLint, Maxwell::NumTransformFeedbackBuffers> xfb_streams{};
 | 
			
		||||
 | 
			
		||||
    std::mutex built_mutex;
 | 
			
		||||
    std::condition_variable built_condvar;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user