Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 12 additions & 7 deletions src/amberscript/parser.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1894,16 +1894,21 @@ Result Parser::ParseRun() {
count = token->AsUint32();
}
}

uint32_t vertex_count =
indexed ? pipeline->GetIndexBuffer()->ElementCount()
: pipeline->GetVertexBuffers()[0].buffer->ElementCount();

// If we get here then we never set count, as if count was set it must
// be > 0.
if (count == 0) {
count =
pipeline->GetVertexBuffers()[0].buffer->ElementCount() - start_idx;
}
if (count == 0)
count = vertex_count - start_idx;

if (start_idx + count >
pipeline->GetVertexBuffers()[0].buffer->ElementCount()) {
return Result("START_IDX plus COUNT exceeds vertex buffer data size");
if (start_idx + count > vertex_count) {
if (indexed)
return Result("START_IDX plus COUNT exceeds index buffer data size");
else
return Result("START_IDX plus COUNT exceeds vertex buffer data size");
}

auto cmd = MakeUnique<DrawArraysCommand>(pipeline, PipelineData{});
Expand Down
58 changes: 58 additions & 0 deletions src/amberscript/parser_run_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1404,6 +1404,64 @@ RUN my_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 1 COUNT 9)";
r.Error());
}

TEST_F(AmberScriptParserTest, RunDrawArraysIndexedStartIdxTooLarge) {
std::string in = R"(
SHADER vertex my_shader PASSTHROUGH
SHADER fragment my_fragment GLSL
# GLSL Shader
END
BUFFER vtex_buf DATA_TYPE vec3<float> DATA
1 2 3
END
BUFFER indices DATA_TYPE int32 DATA
0 1 2 1 2 0
END

PIPELINE graphics my_pipeline
ATTACH my_shader
ATTACH my_fragment
VERTEX_DATA vtex_buf LOCATION 0
INDEX_DATA indices
END

RUN my_pipeline DRAW_ARRAY AS TRIANGLE_LIST INDEXED START_IDX 6 COUNT 1)";

Parser parser;
Result r = parser.Parse(in);
ASSERT_FALSE(r.IsSuccess());
EXPECT_EQ("20: START_IDX plus COUNT exceeds index buffer data size",
r.Error());
}

TEST_F(AmberScriptParserTest, RunDrawArraysIndexedCountTooLarge) {
std::string in = R"(
SHADER vertex my_shader PASSTHROUGH
SHADER fragment my_fragment GLSL
# GLSL Shader
END
BUFFER vtex_buf DATA_TYPE vec3<float> DATA
1 2 3
END
BUFFER indices DATA_TYPE int32 DATA
0 1 2 1 2 0
END

PIPELINE graphics my_pipeline
ATTACH my_shader
ATTACH my_fragment
VERTEX_DATA vtex_buf LOCATION 0
INDEX_DATA indices
END

RUN my_pipeline DRAW_ARRAY AS TRIANGLE_LIST INDEXED START_IDX 1 COUNT 6)";

Parser parser;
Result r = parser.Parse(in);
ASSERT_FALSE(r.IsSuccess());
EXPECT_EQ("20: START_IDX plus COUNT exceeds index buffer data size",
r.Error());
}

TEST_F(AmberScriptParserTest, RunDrawArraysInvalidCountValueFormat) {
std::string in = R"(
SHADER vertex my_shader PASSTHROUGH
Expand Down