A method of generating primitive blocks at a primitive block generator in a graphics processing system, the primitive block generator comprising a data store for storing a current primitive block to which primitives can be added, the method comprising: receiving transformed position data for a current primitive, the transformed position data indicating a position of the current primitive in rendering space; determining, based on the transformed position data for the current primitive, one or more distance metrics that indicate how close, in the rendering space, the current primitive is to the primitives in the current primitive block; determining a fullness of the current primitive block based on at least one of: (i) a number of primitives in the current primitive block compared to a maximum number of primitives, and (ii) where each primitive is defined by one or more vertices, a number of vertices in the current primitive block compared to a maximum number of vertices; dynamically selecting a set of one or more distance thresholds based on the fullness of the current primitive block, the set of one or more distance thresholds comprising a distance threshold for each of the one or more distance metrics; determining whether to add the current primitive to the current primitive block based on a comparison of each of the one or more distance metrics to the corresponding distance threshold of the set of one or more distance thresholds; in response to determining that the current primitive is to be added to the current primitive block, adding the current primitive to the current primitive block; and in response to determining that the current primitive is not to be added to the current primitive block, outputting the current primitive block and adding the current primitive to a new current primitive block (710, 712); wherein selecting the set of one or more distance thresholds based on the fullness of the current primitive block comprises selecting, when the current primitive block has a first fullness level, a first set of one or more distance thresholds and selecting, when the current primitive block has a second fullness level that is higher than the first fullness level, a second set of one or more distance thresholds that are lower than the corresponding distance thresholds in the first set of one or more distance thresholds; wherein it is determined that the current primitive is not to be added to the current primitive block if at least one of the distance metrics exceeds the corresponding distance threshold of the set of one or more distance thresholds; or wherein it is determined that the current primitive is not to be added to the current primitive block only if each of the one or more distance metrics exceeds the corresponding distance threshold of the set of one or more distance thresholds. receiving transformed position data for a current primitive, the transformed position data indicating a position of the current primitive in rendering space; determining, based on the transformed position data for the current primitive, one or more distance metrics that indicate how close, in the rendering space, the current primitive is to the primitives in the current primitive block; determining a fullness of the current primitive block based on at least one of: (i) a number of primitives in the current primitive block compared to a maximum number of primitives, and (ii) where each primitive is defined by one or more vertices, a number of vertices in the current primitive block compared to a maximum number of vertices; dynamically selecting a set of one or more distance thresholds based on the fullness of the current primitive block, the set of one or more distance thresholds comprising a distance threshold for each of the one or more distance metrics; determining whether to add the current primitive to the current primitive block based on a comparison of each of the one or more distance metrics to the corresponding distance threshold of the set of one or more distance thresholds; in response to determining that the current primitive is to be added to the current primitive block, adding the current primitive to the current primitive block; and in response to determining that the current primitive is not to be added to the current primitive block, outputting the current primitive block and adding the current primitive to a new current primitive block (710, 712); wherein selecting the set of one or more distance thresholds based on the fullness of the current primitive block comprises selecting, when the current primitive block has a first fullness level, a first set of one or more distance thresholds and selecting, when the current primitive block has a second fullness level that is higher than the first fullness level, a second set of one or more distance thresholds that are lower than the corresponding distance thresholds in the first set of one or more distance thresholds; wherein it is determined that the current primitive is not to be added to the current primitive block if at least one of the distance metrics exceeds the corresponding distance threshold of the set of one or more distance thresholds; or wherein it is determined that the current primitive is not to be added to the current primitive block only if each of the one or more distance metrics exceeds the corresponding distance threshold of the set of one or more distance thresholds.