A method of storing primitives in a tile-based rendering graphics processing system, the method comprising: receiving a primitive associated with state data that defines how the primitive is to be rendered; determining whether the state data associated with the received primitive matches state data for a current primitive block, the current primitive block comprising one or more primitive sections which are configured to store one or more primitives, the one or more primitive sections comprising a current primitive section stored in a data store; and in response to determining that the state data for the received primitive matches the state data for the current primitive block: determining, based on one or more primitive section size constraints, whether the received primitive is to be added to the current primitive section of the current primitive block; in response to determining that the received primitive is to be added to the current primitive section, adding the received primitive to the current primitive section; and in response to determining that the received primitive is not be added to the current primitive section: outputting the current primitive section; reconfiguring the data store to store a new primitive section of the current primitive block; and adding the received primitive to the new primitive section of the current primitive block; wherein the received primitive is formed of one or more vertices; and adding the received primitive to a primitive section comprises adding a new vertex entry to a vertex data sub-section of the primitive section for each new vertex of the received primitive, and adding a primitive entry to a primitive data sub-section of the primitive section. receiving a primitive associated with state data that defines how the primitive is to be rendered; determining whether the state data associated with the received primitive matches state data for a current primitive block, the current primitive block comprising one or more primitive sections which are configured to store one or more primitives, the one or more primitive sections comprising a current primitive section stored in a data store; and in response to determining that the state data for the received primitive matches the state data for the current primitive block: determining, based on one or more primitive section size constraints, whether the received primitive is to be added to the current primitive section of the current primitive block; in response to determining that the received primitive is to be added to the current primitive section, adding the received primitive to the current primitive section; and in response to determining that the received primitive is not be added to the current primitive section: outputting the current primitive section; reconfiguring the data store to store a new primitive section of the current primitive block; and adding the received primitive to the new primitive section of the current primitive block; determining, based on one or more primitive section size constraints, whether the received primitive is to be added to the current primitive section of the current primitive block; in response to determining that the received primitive is to be added to the current primitive section, adding the received primitive to the current primitive section; and in response to determining that the received primitive is not be added to the current primitive section: outputting the current primitive section; reconfiguring the data store to store a new primitive section of the current primitive block; and adding the received primitive to the new primitive section of the current primitive block; outputting the current primitive section; reconfiguring the data store to store a new primitive section of the current primitive block; and adding the received primitive to the new primitive section of the current primitive block; wherein the received primitive is formed of one or more vertices; and adding the received primitive to a primitive section comprises adding a new vertex entry to a vertex data sub-section of the primitive section for each new vertex of the received primitive, and adding a primitive entry to a primitive data sub-section of the primitive section.